0

这不是关于能够在主/UI 线程中调用方法而是能够立即这样做的问题。

据我所知,由于 UI 响应要求,通常不允许您直接与 UI 线程交互。那么有一个系统来排队你对主线程的请求是有意义的,我们确实有这个系统,带有循环器、处理程序等。

这是我所做的:我在后台线程中执行了一些任务,并且我想在满足条件后立即关闭主线程(我为它创建了一个侦听器)并且我使用响应处理程序来发布它..类似于这个:

if(mNoOfPendingRequests >= mNoOfRequestsConsideredEnough){
            mShouldFlagEnoughRequestsAtATime = true;
            Log.i("ThumbnailDownloader: ","Enough Requests Queued");
            //Now inform about this to PhotoGallery right now
            mResponseHandler.postAtFrontOfQueue(new Runnable() {
                public void run() {
                    mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime);
                }
            });
        }
        else{
            mShouldFlagEnoughRequestsAtATime = false;
            mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime);
        }

如果我没有通知 PhotoGallery已经发送了足够多的请求,它将继续发送越来越多的请求,并且应用程序变得无响应。

此外,请求排队并稍后执行,导致请求过多。

因此,我的问题是:

有没有办法几乎瞬间从后台线程调用 UI 线程中的方法/通知?

4

5 回答 5

1

您可以在 UI 线程上执行以下操作:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // put your code here :)
    }
});
于 2016-08-27T17:22:14.797 回答
1

有没有办法几乎瞬间从后台线程调用 UI 线程中的方法/通知?

并不真地。你postAtFrontOfQueue()的接近,正如粗体字在文档中提到的那样,“这个方法只用于非常特殊的情况——它很容易让消息队列饿死,导致排序问题,或者有其他意想不到的一面——效果。”

如果我没有通知 PhotoGallery 已经发送了足够多的请求,它将继续发送越来越多的请求,并且应用程序变得无响应。此外,请求排队并稍后执行,导致请求过多。

在你的队列中拥有更多的智慧,知道什么时候根据你的“足够”算法来限制请求处理。

于 2016-08-27T17:31:05.747 回答
0

从您的代码中不清楚,它是做什么onEnoughRequestsQueued的。如果它所做的只是告诉发布线程它应该停止发送请求,那么您可能可以通过一个简单的volatile boolean

如果线程排队请求停止这样做,当变量为真时,后台线程将其设置为真,并且变量是volatile你应该好的。

于 2016-08-27T17:37:18.963 回答
0

除非您的事件队列中已经有很多事件,否则此方法就像一个魅力。
activity.runOnUiThread(new Runnable() { public void run() { // 在这里调用你的方法 } });

于 2016-08-27T17:32:43.823 回答
0

是的,您可以使用活动上下文调用

runOnUiThread()并传递可运行对象并在 run() 方法中编写代码。

于 2016-08-27T17:35:54.860 回答