我正在使用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