带有 Retrofit2 的 RXJava 我无法检索服务器响应,也无法检索简单的 Log.d

RXJava with Retrofit2 I can't retrieve the server response, nor a simple Log.d

我从调试中看到数组已被检索,但是如果我在 onNext 中将 Log.d 放在数组的第一个位置,我不会在控制台中检索日志,我也不会知道我是否以正确的方式调用数组的第一个位置

Log.d("IVO", "onNext" + WhosebugQuestions.items.get(0).title.toString());

这是主要的

package com.vogella.android.retrofitWhosebug;

import (..)


public class MainActivity extends ListActivity {
//original https://api.stackexchange.com/2.2/search?order=desc&sort=activity&tagged=android&site=Whosebug

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    ArrayAdapter<Question> arrayAdapter =
            new ArrayAdapter<Question>(this,
                    android.R.layout.simple_list_item_1,
                    android.R.id.text1,
                    new ArrayList<Question>());
    setListAdapter(arrayAdapter);
    setProgressBarIndeterminateVisibility(true);
    setProgressBarVisibility(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    setProgressBarIndeterminateVisibility(true);
    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.stackexchange.com")
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    // prepare call in Retrofit 2.0
    WhosebugAPI WhosebugAPI = retrofit.create(WhosebugAPI.class);


    //the real call to the server
    //Call<WhosebugQuestions> call = WhosebugAPI.loadQuestions("android");


    Observable<WhosebugQuestions> observable = WhosebugAPI.loadQuestions("android");

    observable.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<WhosebugQuestions>() {
                @Override
                public void onCompleted() {
                    Log.d("IVO", "completed");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(WhosebugQuestions WhosebugQuestions) {

                    Log.d("IVO", "onNext" + WhosebugQuestions.items.get(0).title.toString());
                    Log.d("IVO", "onNext" );
//                        ArrayAdapter<Question> adapter = (ArrayAdapter<Question>) getListAdapter();
//                        adapter.clear();
//                        adapter.addAll(response.body().items);
                }
            });





    return true;
}

}

这是 Whosebug 问题

package com.vogella.android.retrofitWhosebug;

import java.util.List;

public class WhosebugQuestions {
    List<Question> items;
}

这是问题

package com.vogella.android.retrofitWhosebug;

// This is used to map the JSON keys to the object by GSON
public class Question {

    String title;
    String link;

    @Override
    public String toString() {
        return(title);
    }
}

编辑 WhosebugAPI 根据要求:

package com.vogella.android.retrofitWhosebug;

import android.util.Log;

import retrofit2.Callback;
import retrofit2.http.GET;
import retrofit2.http.Query;
import retrofit2.Call;
import rx.Observable;

public interface WhosebugAPI {
    @GET("/2.2/questions?order=desc&sort=creation&site=Whosebug")
    //Call<WhosebugQuestions> loadQuestions(@Query("tagged") String tags);
    Observable<WhosebugQuestions>  loadQuestions(@Query("tagged") String tags);



}

终于找到解决办法了 将这段代码放在 onOptionsItemSelected 中,基本上就是我获取内容的地方,我在 Observable 的 onNext 方法中收到响应,无需使用 Retrofit2 方法 onResponse:

adapter.addAll(WhosebugQuestions.items);

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    setProgressBarIndeterminateVisibility(true);
    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.stackexchange.com")
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    // prepare call in Retrofit 2.0
    WhosebugAPI WhosebugAPI = retrofit.create(WhosebugAPI.class);


    //the real call to the server
    //Call<WhosebugQuestions> call = WhosebugAPI.loadQuestions("android");


    Observable<WhosebugQuestions> observable = WhosebugAPI.loadQuestions("android");

    observable.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<WhosebugQuestions>() {
                @Override
                public void onCompleted() {
                    Log.d("IVO", "completed");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(WhosebugQuestions WhosebugQuestions) {

                    Log.d("IVO", "onNext " + WhosebugQuestions.items.get(0).title.toString());
                    Log.d("IVO", "onNext " + WhosebugQuestions.items.get(1).title.toString());
                    Log.d("IVO", "onNext " + WhosebugQuestions.items.get(2).title.toString());

                    Log.d("IVO", "onNext");
              ArrayAdapter<Question> adapter = (ArrayAdapter<Question>) getListAdapter();

                    adapter.clear();
                    //setListAdapter(arrayAdapter);

                  //  adapter.addAll(response.body().itemsitems);
                    adapter.addAll(WhosebugQuestions.items);

                }
            });


    return true;
}
}