我的活動名爲AllStores
的列表僅包含null。我需要這個列表,因爲我想稍後填充我的ListView。問題是由於我的回調作爲最後一個執行而引起的。試圖首先執行Retrofit onResponse
爲了澄清我做了下面的截圖:
鏈接:http://i.imgur.com/bIkWjld.png
的截圖還告訴我真正想要的。爲了達到這個目的,我試了一下AsyncTask
。然而,它並沒有像你在屏幕截圖中看到的那樣成功。
下面是代碼:
EDIT 2.0我已改變getSubprise()
方法成爲同步和使用的AsyncTask
AllStores.java:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Response<List<Store>> subprises = new StoreService().getSubprises();
System.out.println("AllStores (Activity) - subprise " + subprises);
}
StoreService.java :
public Response<List<Store>> getSubprises() {
new LongOperation().execute("");
System.out.println("getStores (StoreService.java) value "+ getStores());
return getStores();
}
private class LongOperation extends AsyncTask<String, Void, Response<List<Store>>> {
@Override
protected Response<List<Store>> doInBackground(String... params) {
System.out.println("doInBackground executed second");
try {
Call<List<Store>> call = subpriseAPI.listStores();
stores=call.execute();
Iterator it=stores.body().iterator();
// while(it.hasNext())
// System.out.println(((Store)it.next()).getSTREET());
} catch (IOException e) {
e.printStackTrace();
}
return stores;
}
@Override
protected void onPreExecute() {
//Can't put the call here because this is the main thread
System.out.println("onPreExecute first");
}
@Override
protected void onPostExecute(Response<List<Store>> result) {
//Can't put the call here because this is the main thread
setStores(stores);
}
}
public Response<List<Store>> getStores() {
return stores;
}
public void setStores(Response<List<Store>> stores) {
this.stores = stores;
}
但是我現在仍然得到同樣的結果見下圖:
鏈接:http://i.imgur.com/GOGFXMR.png
的截圖看起來如同從上面的截圖。
你真的應該閱讀有關異步代碼和回調一些文檔。由於異步入隊調用,完整的asynctask是無用的。您的加載數據將在響應被調用時可用,所以需要更新ui。 –
@Andre Classen是的,你所說的確是對的。但是我編輯了我的問題,你現在可以回答它了嗎? – superkytoz
現在您已將異步入隊調用更改爲同步execeute調用。異常說明了所有'NetworkOnMainThreadException'。網絡調用必須在後臺線程中完成。例如。在asyncTask中調用'doInBackground()'。 –