2012-07-18 9 views
1

我有一个后台线程休眠1/10秒,然后重新循环。我希望它使屏幕无效,所以它会重绘并做一个简单的动画。这似乎是我可以使屏幕无效的唯一方法是,如果我在Runnable中执行该操作,该操作会承担很多开销。有没有办法使一个线程无效(更新)屏幕不使用可运行

有没有办法使一个线程内的屏幕无效,而不使用runnable?

回答

3

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

公共无效postInvalidate()

导致一个无效通过事件循环在随后的循环发生。使用它来使非UI线程中的视图无效。

只有当此视图连接到窗口时,才能从UI线程之外调用此方法。

请参见

invalidate() 
postInvalidateDelayed(long) 
0

从后台线程中调用任何与UI相关的API是不合法的。所以你需要使用Runnable

如果后台线程所做的唯一事情就是睡眠,那么可以通过使用CountDownTimer类代替而不使用线程来实现相同的效果。或者,您可以使用Handler.postAtTime() API将Runnable安排在您的UI线程上以毫秒为单位运行(同样,不使用单独的线程)。

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自动运行...

0

尝试发送消息给处理器在你的线程中,并在handleMessage中无效。它可能工作。 或使用像Salil Pandit这样的AsyncTask表示。我认为异步更好。

相关问题