带有 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;
}
}
我从调试中看到数组已被检索,但是如果我在 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;
}
}