Android Honeycomb:Fragment 无法启动 AsyncTask? [英] Android Honeycomb: Fragment not able to start AsyncTask?

查看:19
本文介绍了Android Honeycomb:Fragment 无法启动 AsyncTask?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've run into this error before, but thought it was some mistake by the strict mode system. However, it apparently was right as I sadly found out now. :(

我的程序由一个活动和大量片段组成.我有一个 NetworkWorker 片段,它启动 URL 请求,如下所示:

My programm is made of one Activity and loads of Fragments. I have a NetworkWorker fragment, which starts URL requests like this:

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 派生的自定义内部类:

FragmentHttpHelper is a custom inner class derived from 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 请求的 Fragment 上进行回调.当我在我的 2.2 应用程序中使用它时,这个类一直运行良好.那时我会在我的活动中派生它.

NetworkWorkerListener is just an interface for a callback on the Fragment which started the URL request. This class has always worked fine when I used it in my 2.2 app. I would derive it in my Activities then.

现在,如果选择了一个菜单项,另一个 worker Fragment 通过上述方法启动 URL 请求并打开一个加载对话框:

Now, if a menu item is selected, another worker Fragment starts the URL request via the above method and opens a loading dialog:

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() 的含义.

At least that's what supposed to happen. Instead, when I click the menu item, my app freezes and no loading dialog is shown until. Next happening is the reaction to the end of the download (or, in my case an error message, as I am sending nonsense strings). Meaning onPostExecute() was reached.

我现在真的很困 - 是否无法将 AsyncTask 与 Fragment 一起使用?还是我做错了什么?

I feel really stuck now - is it not possible to use AsyncTask with Fragments? Or did I do something wrong?

感谢您的帮助,水母

推荐答案

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

Don't call doInBackground directly, call execute instead (on the async task)

这篇关于Android Honeycomb:Fragment 无法启动 AsyncTask?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆