Android Honeycomb:Fragment无法启动AsyncTask?

发布于 2024-11-16 09:56:48 字数 3037 浏览 1 评论 0原文

我之前遇到过 此错误,但是认为这是严格模式系统的一些错误。然而,这显然是正确的,因为我现在悲伤地发现。 :(

我的程序由一个 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 上进行回调的接口当我在 2.2 应用程序中使用该类时,我会在我的 Activity 中派生它,现在

,如果选择了一个菜单项,则会启动另一个工作片段。通过上述方法发送 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 一起使用?还是我做错了什么?

感谢您的帮助, 海蜇

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. :(

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 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 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.

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

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.

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

Thanks for your help,
jellyfish

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦开始←不甜 2024-11-23 09:56:48

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文