【问题标题】:Close runOnUiThread关闭 runOnUiThread
【发布时间】:2016-08-29 16:59:28
【问题描述】:

我有一个 AsyncTask 正在运行,在这个线程中我启动了一个 runOnUiThread 来操作我的视图。如果我关闭我的 AsyncTask,runOnUiThread 在我关闭我的 AsyncTask 后仍会运行 1 次。如何关闭 runOnUiThread?谢谢!

@Override
protected String doInBackground(String... params) {
    while(running.get()) {

        // Background thread sleeps
        try {
            Thread.sleep(produceRadwaste_countdown * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // UI thread touching some view elements
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                radwasteTon.incrementStack();
            }
        });

        // Delete thread if player is game over
        if(GameLogic.isGameOver()) {
            clearThreads();
        }
    }

    return "Running";
}

public void clearThreads() {
    running.set(false);
    this.cancel(true);
}

【问题讨论】:

    标签: android android-asynctask android-runonuithread


    【解决方案1】:

    我可以提出不同的解决方案吗?

    在 AsyncTask 中实现 onProgressUpdate(Params...) 方法。然后你可以从 doInBackground(Params...); 调用 publishProgess;

    onProgressUpdate(Params...) 将在 ui 线程上运行。

    【讨论】:

    • 感谢它在 UI 上工作,我不需要 runOnUiThread,但在我取消线程后它仍然运行 1 次
    • 好吧,我用 logcat 检查了整个过程,这有点奇怪,因为有时他在检查游戏之前执行了 publishProgress(),有时他在执行 publishProgress() 之前检查了布尔值。现在我在这两个操作之间做了一点 Thread.sleep 并且它可以工作,但我认为这不是最好的解决方案。
    • 我读到 AsyncTask 有一个最大池大小,这对我的游戏来说是一件非常糟糕的事情,因为这个线程将在每个游戏图标上运行,我将拥有大约 5 到 10 个项目。跨度>
    • 根据 Android 版本,AsnycTask 可能有 5 个或只有 1 个线程池大小。您可以使用方法executeOnExector 和提供Executor 来更改调整。有关更多信息,您需要在线搜索,我还没有这样做。由于我很懒,我通常会选择基本的 java Threads 或 RxJava,以防像你这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多