这不是能够在主/ 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线程中的方法/通知?
答案 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
时,你应该是好的。