有没有办法在不使用runnable的情况下使线程无效(更新)屏幕

时间:2012-07-18 23:26:29

标签: android multithreading android-view

我有一个后台线程,睡眠时间为1/10秒,然后重新循环。我希望它能使屏幕无效,所以它会重绘并做一个简单的动画。似乎我可以使屏幕无效的唯一方法是在Runnable中执行此操作,假设它有很多开销。

有没有办法在不使用runnable的情况下使线程内的屏幕无效?

4 个答案:

答案 0 :(得分:3)

Android SDK具有用于此目的的内置API - View.postInvalidate()

  

public void postInvalidate()

     

导致在事件循环的后续循环中发生无效。使用此选项可以从非UI线程中使视图无效。

     

只有当此视图附加到窗口时,才能从UI线程外部调用此方法。

     

另见

 invalidate()  
 postInvalidateDelayed(long)

答案 1 :(得分:0)

从后台线程调用任何与UI相关的API是不合法的。因此,您需要使用Runnable

如果后台线程唯一做的就是休眠,那么通过使用CountDownTimer类,您可以在不使用线程的情况下实现相同的效果。或者,您可以使用Handler.postAtTime() API来安排Runnable在未来的某个毫秒内在您的UI线程上运行(同样,不使用单独的线程)。

答案 2 :(得分:0)

我实际上认为开销是可以忽略不计的。但您可以使用AsyncTask,如下所示:

new AsyncTask<Void, Void, Void>() {
  /* (non-Javadoc)
   * @see android.os.AsyncTask#doInBackground(Params[])
   */
  @Override
  protected Void doInBackground(Void... params) {
    while(true) { //probably want some other challenge here
      Thread.sleep(1000 / 10);
      publishProgress();
    }
    return null;
  }

  /* (non-Javadoc)
   * @see android.os.AsyncTask#onProgressUpdate(Progress[])
   */
  @Override
  protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
    mMyView.invalidate();
  }
}.execute();

这很好,因为onProgressUpdate会自动在UIThread上运行,所以你不必每次都创建一个新的runnable ......

答案 3 :(得分:0)

尝试向线程中的处理程序发送消息,并在handleMessage中使其无效。它可能有效。 或者像Salil Pandit一样使用AsyncTask。我认为Async更好。