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

时间:2016-08-27 17:19:44

标签: android android-handlerthread

这不是能够在主/ UI线程中调用方法但能够立即执行此操作的问题。

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

这是我做的: 我在后台线程中做了一些任务,一旦条件得到满足,我想亲密主线程(我为它创建了一个监听器)并且我使用响应处理程序发布它......这样的事情:

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线程中的方法/通知?

5 个答案:

答案 0 :(得分:1)

  

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

不是真的。您的std::vector尽可能接近,并且正如the docs中提到的粗体注释,"此方法仅适用于非常特殊的情况 - 它很容易使信息匮乏排队,导致排序问题,或有其他意想不到的副作用。"

  

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

您的队列中有更多智能,知道何时根据您的"足够的"来减少请求处理。算法是。

答案 1 :(得分:0)

你可以在UI线程上运行这样做:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // put your code here :)
    }
});

答案 2 :(得分:0)

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

答案 3 :(得分:0)

是的,您可以使用活动上下文进行呼叫

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

答案 4 :(得分:0)

您的代码中不清楚onEnoughRequestsQueued的作用。如果它所做的只是告诉发布帖子它应该停止发送请求,那么你可以用一个简单的volatile boolean

完成同样的事情。

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