我有一个后台线程,睡眠时间为1/10秒,然后重新循环。我希望它能使屏幕无效,所以它会重绘并做一个简单的动画。似乎我可以使屏幕无效的唯一方法是在Runnable中执行此操作,假设它有很多开销。
有没有办法在不使用runnable的情况下使线程内的屏幕无效?
答案 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更好。