Android Honeycomb:Fragment无法启动AsyncTask?

jel*_*ish 3 android android-asynctask android-fragments android-3.0-honeycomb

我之前遇到过这个错误,但认为严格模​​式系统有些错误.然而,它显然是正确的,因为我现在遗憾地发现了.:(

我的程序由一个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;
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

至少那是应该发生的事情.相反,当我单击菜单项时,我的应用程序冻结,直到显示没有加载对话框.接下来发生的是对下载结束的反应(或者,在我的情况下是一条错误消息,因为我发送的是无意义的字符串).意思是onPostExecute()已达到.

我觉得现在真的卡住了 - 是不是可以将AsyncTask与Fragments一起使用?或者我做错了什么?

谢谢你的帮助,海蜇

smi*_*324 7

不要doInBackground直接打电话,execute而是打电话(在异步任务上)