【问题标题】:Seperate Thread which calls a method which runsOnUiThread调用 runOnUiThread 方法的单独线程
【发布时间】:2015-01-21 23:33:25
【问题描述】:

我得到了一个带有 1 个线程的 FixedSizeThreadPool(因为我只需要一个,并且每个后续请求都应该等到之前的请求完成):

myService = Executors.newFixedThreadPool(1);
    myService.execute(new WorkerRunnable());

在我的 WorkerRunnable 中我做了一些事情,在中间我从我的 Activity 中调用一个方法:

myActivity.thisMethodRunsOnUiThread();

方法如下:

public void thisMethodRunsOnUiThread() {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            I'm trying to Change a View here, that's why i Need to do this on Ui Thread
        }

    });
}

然后在 WorkerRunnable 上出现了我的最后一个方法,它应该再次在来自 fixedSizePool 的单独线程上运行

myActivity.thisMethodsRunsonUiThread();
thisMethodRunsAgainOnTheSeperateThread();

但我这里提到的是,他只在 MethodWhichShouldRunOnSeperateThread 之后调用应该 RunOnUiThread 的方法。(这是最后一个方法,所以我的线程此时将完成)。难道是seperateThread比MainThread获得了更高的优先级,所以他等到seperateThread完成后再启动UiThread上运行的方法?

我需要完成方法

myActivity.thisMethodsRunsonUiThread();

在这个方法之前

thisMethodRunsAgainOnTheSeperateThread();

谁能解释他为什么会这样?任何帮助表示赞赏。

【问题讨论】:

    标签: android threadpool


    【解决方案1】:

    参考http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

    如果当前线程不是UI线程,则将动作发布到UI线程的事件队列中

    因此,这个 runnable 必须等待一段时间才能执行

    您可以使用wait()notify()/notifyAll() java 方法进行线程操作

    【讨论】:

    • 您能提供一些代码以便更好地理解吗?因为你说runnable必须等待一段时间才能执行。在这种情况下,情况并非如此。我还声明了一个静态布尔变量,如果 UIThread 方法完成,它会切换为 true。我在一个单独的线程中打包了这个方法,并询问布尔值是否设置为真。但是 while-Loop 无休止地运行,UIMethod 永远不会被调用,因为 seperateThread 永远不会完成。我希望你明白。也许我误会了什么......
    • 你能提供你的代码吗:) 你没有提到你的静态布尔标志,奇怪的是你在 UIThread 上发布的方法没有被执行。
    • 别误会,我不想公开我的代码。此外,它会使问题超载..我认为描述问题的最佳方法是我在上面做的方式..我认为这并不奇怪,必须有一个合乎逻辑的答案..是的,我认为现在是时候了信息。还有其他建议吗?将不胜感激
    • 我唯一的想法是,在旋转过程中你泄露了你的活动对象(mActivity),你尝试将你的可运行对象发布到并更改已经被破坏的视图。但没有代码我不能确定
    • 你的意思是,如果我将我的设备从纵向旋转到横向,反之亦然?不,我不这样做..但无论如何感谢您的时间和帮助。希望有人可以帮助我;/
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多