Android蜂巢:Fragment无法启动AsyncTask?

3
我之前遇到过这个错误,但当时认为是严格模式系统的一些错误。然而,现在我很遗憾地发现它是正确的。 :(
我的程序由一个Activity和许多Fragments组成。我有一个NetworkWorker fragment,它会像这样启动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是一个回调接口,用于在启动URL请求的碎片上进行回调。当我在我的2.2应用程序中使用它时,这个类一直工作得很好。然后我会在我的活动中派生它。

现在,如果选择菜单项,则另一个工作碎片通过上述方法开始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一起使用吗?还是我做错了什么?

谢谢你的帮助, jellyfish


您检查了log cat输出了吗? - Flo
我只捕获并打印到日志中的一个异常。 - jellyfish
1个回答

7
不要直接调用doInBackground,而是调用execute(在异步任务上)。

1
哦,我真是太蠢了,谢谢!应该更仔细地看我的智能手机应用程序。;) - jellyfish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接