我之前遇到this error,但认为严格模式系统有些错误。然而,它显然是正确的,因为我现在遗憾地发现了。 :(
我的程序由一个Activity和一堆Fragments组成。我有一个NetworkWorker片段,它启动这样的URL请求:
public void startURLRequest(Fragment target, String url, String message)
{
if (asyncTask != null) asyncTask.cancel(true);
asyncTask = new FragmentHttpHelper(url, message, target);
asyncTask.doInBackground();
return;
}
FragmentHttpHelper是一个派生自AsyncTask的自定义内部类:
private class FragmentHttpHelper extends AsyncTask<Void, Void, String>
{
//...
@Override
protected String doInBackground(Void... params)
{
if (CheckInternet())
{
try
{
URL myURL = new URL(url);
httpClient = new DefaultHttpClient();
if (this.message == null)
{
httpRequest = new HttpGet(myURL.toExternalForm());
}
else
{
httpRequest = new HttpPost(myURL.toExternalForm());
HttpEntity myEntity = new StringEntity(message, "UTF-8");
((HttpPost) httpRequest).setEntity(myEntity);
}
// and so on...
}
//catches
finally
{
// auf jeden Fall Verbindung beenden
if (httpRequest != null) httpRequest.abort();
// if (httpClient != null) httpClient.close();
}
}
else
{
showDialog(getString(R.string.net_notify_no_network), target);
}
//...
}
/**
* gets called after AsyncTask has finished
*/
protected void onPostExecute(String result)
{
if (target == null)
{
((NetworkWorkerListener) getActivity()).onDownloadHasFinished((!result.contentEquals(ERROR)), result);
}
else
{
((NetworkWorkerListener) target).onDownloadHasFinished((!result.contentEquals(ERROR)), result);
}
}
}
NetworkWorkerListener只是Fragment上的回调接口,它启动了URL请求。当我在2.2应用程序中使用它时,这个类总是工作正常。我会在我的活动中得出它。
现在,如果选择了一个菜单项,另一个工作人员Fragment将通过上述方法启动URL请求并打开一个加载对话框:
FragmentManager fragmentManager = getFragmentManager();
NetworkWorker network = (NetworkWorker) fragmentManager.findFragmentByTag(TabletMain.NETWORK);
if (network == null) return WorkerFeedback.NO_NETWORK_WORKER;
myDialog = LoadingDialog.createInstance(getString(R.string.notify_download), this);
myDialog.show(fragmentManager, TabletMain.ONETIME);
network.startURLRequest(this, someurl, null);
至少那是应该发生的事情。 相反,当我单击菜单项时,我的应用程序冻结,直到显示没有加载对话框。接下来发生的是对下载结束的反应(或者,在我的情况下是错误消息,因为我发送的是无意义的字符串)。意思是onPostExecute()已达到。
我觉得现在真的被卡住了 - 是不是可以将AsyncTask与Fragments一起使用?或者我做错了什么?
感谢您的帮助, 水母
答案 0 :(得分:7)
请勿直接致电doInBackground
,而是调用execute
(在异步任务上)