我正在使用Retrofit从api返回响应。来自该响应的数据将被提供给回收者视图。将数据对象传递给回收站视图时,我会得到一个空指针异常。这是因为,在设置回收站视图之前,应用程序不会等待返回响应。无论如何有这个应用程序在继续之前等待响应?Android Retrofit - 在执行其他代码之前等待响应?
我试过做同步改造请求,但我仍然得到同样的问题。我已经尝试在AsyncTask的onPostExecute方法中调用setupRecyclerView(),但这也不起作用。
public class SearchResultsActivity extends BaseActivity {
// UI
private Toolbar toolbar;
private SearchView searchbox;
private RecyclerView rvResults;
// Business Logic
private String searchQuery;
public Response response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_results);
searchQuery = getSearchQuery();
setupToolbar(searchQuery);
searchForProduct(searchQuery);
}
private void setupRecyclerView() {
rvResults = (RecyclerView) findViewById(R.id.rvResults);
rvResults.setHasFixedSize(true);
rvResults.setLayoutManager(new LinearLayoutManager(activityContext));
ResultAdapter adapter = new ResultAdapter(response.getResults());
rvResults.setAdapter(adapter);
}
private void setupToolbar(String query) {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("");
}
private void searchForProduct(String query) {
new SearchZaposTask().execute("e");
}
private String getSearchQuery() {
String query = "";
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
query = intent.getStringExtra(SearchManager.QUERY);
}
return query;
}
public class SearchZaposTask extends AsyncTask<String, Void, Response> {
@Override
protected Response doInBackground(String... params) {
RestAdapter retrofit = new RestAdapter.Builder()
.setEndpoint(Constants.BASE_URL)
.build();
ZapposAPI api = retrofit.create(ZapposAPI.class);
return api.searchZappos(searchQuery);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Response searchresponse) {
super.onPostExecute(searchresponse);
//Toast.makeText(activityContext,response.getResults().get(0).getProductName(),Toast.LENGTH_LONG).show();
response = searchresponse;
setupRecyclerView();
}
}
}
编辑:添加ZapposAPI为@tmalseed看
public interface ZapposAPI {
@GET("/mobileapi/v1/search?")
Response searchZappos(@Query("term") String query);
@GET("/mobileapi/v1/search?")
void searchZapos(@Query("term") String query, Callback<Response> responseCallback);
@GET("https://zappos.amazon.com/mobileapi/v1/product/asin/{asin}")
Asin searchByAsin(@Path("asin") String asin);
}
由于一些奇怪的原因,来电setupRecyclerView将无法正常工作。我有类似的问题,而如果我从onBacakGround()调用此相同的函数调用工作正常。专家对此问题需要更多见解!我切换到凌空,我没有面对这个问题!如果它适合你的需求,也许你想射门射门! – k2ibegin
您可以使用改装而不使用asyncSk。这可能是更容易的任务。按照我的github回购:https://github.com/manishandroid/RetrofitAndroidExample –
你可以请张贴您的ZapposAPI代码? –