我有一个后台线程休眠1/10秒,然后重新循环。我希望它使屏幕无效,所以它会重绘并做一个简单的动画。这似乎是我可以使屏幕无效的唯一方法是,如果我在Runnable中执行该操作,该操作会承担很多开销。有没有办法使一个线程无效(更新)屏幕不使用可运行
有没有办法使一个线程内的屏幕无效,而不使用runnable?
我有一个后台线程休眠1/10秒,然后重新循环。我希望它使屏幕无效,所以它会重绘并做一个简单的动画。这似乎是我可以使屏幕无效的唯一方法是,如果我在Runnable中执行该操作,该操作会承担很多开销。有没有办法使一个线程无效(更新)屏幕不使用可运行
有没有办法使一个线程内的屏幕无效,而不使用runnable?
Android SDK有一个内置的API用于此目的 - View.postInvalidate():
公共无效postInvalidate()
导致一个无效通过事件循环在随后的循环发生。使用它来使非UI线程中的视图无效。
只有当此视图连接到窗口时,才能从UI线程之外调用此方法。
请参见
invalidate() postInvalidateDelayed(long)
从后台线程中调用任何与UI相关的API是不合法的。所以你需要使用Runnable
。
如果后台线程所做的唯一事情就是睡眠,那么可以通过使用CountDownTimer
类代替而不使用线程来实现相同的效果。或者,您可以使用Handler.postAtTime()
API将Runnable
安排在您的UI线程上以毫秒为单位运行(同样,不使用单独的线程)。
我其实认为这个开销是可以忽略的。但是你如下可以使用一个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自动运行...
尝试发送消息给处理器在你的线程中,并在handleMessage中无效。它可能工作。 或使用像Salil Pandit这样的AsyncTask表示。我认为异步更好。