【问题标题】:Asynctask cancelled when interstitial ad shown显示插页式广告时取消 Asynctask
【发布时间】:2014-04-21 21:37:07
【问题描述】:

我的应用中有一个 Asynctask,它在后台运行一个进程来加载网站并从中检索信息。在此期间,我会显示一个加载对话框。

在此过程进行时,我会展示一个插页式(全屏)广告。

编辑:显示此广告时(不一定是按下 x 时),应用程序取消我的 Asynctask。

我希望广告不取消我的 Asynctask。

private class LongOperation extends AsyncTask<Object, Void, String> {
    ProgressDialog dialog;

    @Override
    protected String doInBackground(Object... params) {

        try {
            Log.d(TAG, "Parsing website...");
            ArrayList<String> links = new ArrayList<String>();
            links = pullLinks((String) params[1]);
            Configuration config = new Configuration();
            config.setLocalStoragePath((String) params[0]);
            // Get desktop versions only
            config.setBrowserUserAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4");
            Goose goose = new Goose(config);
            Article article = goose.extractContent(links.get(0));
            return article.cleanedArticleText();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }

    @Override
    protected void onPostExecute(String webText) {

        // Allow rotation
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        Log.i(TAG, "EXECUTED");
        if (webText.equals(""))
            handleSendText(UNSUPPORTED_WEBSITE);
        else
            handleSendText(webText);
        dialog.dismiss();
        super.onPostExecute(webText);
    }

    @Override
    protected void onPreExecute() {
        lockOrientation();
        dialog = ProgressDialog.show(PasteActivity.this, "Add",
                "Getting article from website, please wait...", true, true,
                new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        dialog.dismiss();
                        LongOperationTask.cancel(true);
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                    }
                });
        dialog.setCancelable(false);
    }

    @Override
    protected void onCancelled() {
        Toast.makeText(PasteActivity.this, "Adding cancelled.",
                Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

另一个编辑:添加:

dialog.setCanceledOnTouchOutside(false);

也不解决这个问题。

编辑:删除:

LongOperationTask.cancel(true);

也不解决这个问题。

编辑:所以我意识到插页式广告实际上在我的活动上调用 onPause()。在我的 onPause 中,我取消了我的任务。我正在尝试将取消任务移动到 onStop() 。但这并不理想。

更新:也没有解决这个问题。但是一旦我取消广告,任务似乎会继续运行。但是几秒钟后它仍然被取消。

【问题讨论】:

  • 我相信这个问题会受益于显示更多代码,至少是来自您的活动的生命周期回调,以便其他成员可以弄清楚发生了什么。还有,你的广告shouldn't cause onPause() to be called,对不对?

标签: android android-asynctask ads


【解决方案1】:

我相信您的 AsyncTask 与您的 Activity 相关联(您的 AsyncTask 实例可能是您的 Activity 的一个属性 - 否则请向我们展示它们之间的关系,以便我们提供帮助)。因此,当您重新创建 Activity(例如,通过执行 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED))时,AsyncTask 引用将丢失(垃圾收集)并停止运行。

为了让AsyncTask 在整个方向变化中保持运行,我的建议是遵循this sample project 中显示的模式(不过,在您使用Fragments 的情况下,这样做的方式有点过时,但是它很简单而且很有效)。

【讨论】:

  • 实际上,即使强制方向为纵向(即无法旋转),广告展示时任务也会被取消。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多