我正在使用Vk Sdk。我創建了AsyncTask以在後臺從服務器加載數據。但是,事實證明,doInBackground()
在其內部的任務完成之前完成。代碼如下:AsyncTask在其內部的方法完成之前正在完成doInBackground()
@Override
protected Void doInBackground(Void... params) {
Log.v(TAG, "Before Loading in Background");
VKRequest request = VKApi.wall().get(VKParameters.from(VKApiConst.OWNER_ID, "-100177655", VKApiConst.OFFSET, "2"));
request.executeWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
super.onComplete(response);
String jsonData = response.responseString;
Log.v(TAG, "json is ready");
try {
Log.v(TAG, "before parsing");
parsePostsData(jsonData);
Log.v(TAG, "after parsing");
} catch (JSONException e) {
Log.v(TAG, "EXCEPTION is thrown");
e.printStackTrace();
}
}
});
Log.v(TAG, "Finished Background Tasks");
return null;
}
我懷疑request.executeWithListener(...)
正在創造另一個線程,並做必要的工作在那裏。因此,AsyncTask認爲他的主題中的工作已完成。但是,我不確定。此方法的文檔中沒有任何內容。
另一個問題是調用哪個線程onComplete(...)
時它正在運行?在主要還是由request
創建的單獨線程?
任何幫助表示讚賞:)
你說得對。回調/監聽器是罪魁禍首。如果請求是異步的,你不需要'AsyncTask' –
我認爲它的工作方式與okHttp的'Call'類似,用異步回調執行 –
@ElvisChweya你對'onComplete(...)'方法有什麼看法?它在主線程上運行嗎?如何檢查? – Marat