2016-08-27 37 views
0

这不是关于能够在主/ UI线程中调用方法但能够立即执行的问题。是否有一种方法几乎可以即时从后台线程调用UI线程中的方法?

据我所知,由于UI响应需求,您通常不被允许直接与UI线程交互。这将是有道理的,然后有一个系统到位排队主线程的请求,我们确实有系统与活套,处理程序等。

这是我做的: 我做了一些任务在后台线程,我想尽快函告主线程的条件得到满足(我创建了它监听)我用的是响应处理后it..something这样的:

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

您可以运行在UI线程的事情这样做:

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

ummmm ...创建两个新对象,只是要在UI线程上发布一些东西? –

1

有没有办法来调用一个方法/从后台线程在UI线程通知几乎是瞬间?

不是。您的postAtFrontOfQueue()与您可以获得的差不多,并且如the docs中提到的黑体字注释所述,“此方法仅适用于非常特殊的环境 - 它可能容易使信息队列挨饿,导致订购问题或出现其他意外方面效果 - “。

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

在你的队列中有更多的智能,知道何时根据你的“足够”的算法阻止请求处理。

+0

阅读你所说的话和我一直在猜测的内容......如果有一种方法可以在主线程上瞬时执行任务,它肯定会被像“我”这样的人滥用。没有太惊奇的是找不到方法。无论如何,谢谢你的回应。 –

+1

请注意UI线程上的postAtFrontOfQueue!它可以像长时间运行的任务一样轻松地挨饿。 –

0

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

0

是的,你可以调用使用活动情境

runOnUiThread()并通过Runnable对象和写入内部的run()方法的代码。

0

从代码中不清楚onEnoughRequestsQueued的作用。如果所有它做的是告诉张贴线程,它应该停止发送请求,那么你大概可以完成同样的事情用一个简单的volatileboolean

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

相关问题