Android UI线程和Surfaceview
我对安卓非常陌生。我在android开发者网站上看到了关于android线程的两条规则:Android UI线程和Surfaceview,android,multithreading,user-interface,Android,Multithreading,User Interface,我对安卓非常陌生。我在android开发者网站上看到了关于android线程的两条规则: 1 : Do not block the UI thread 2 : Do not access the Android UI toolkit from outside the UI thread 如果您查看android sdk的LunarLander示例,可以看到以下代码: class LunarView extends SurfaceView implements SurfaceHolder.Cal
1 : Do not block the UI thread
2 : Do not access the Android UI toolkit from outside the UI thread
如果您查看android sdk的LunarLander示例,可以看到以下代码:
class LunarView extends SurfaceView implements SurfaceHolder.Callback {
//...
public LunarView(Context context, AttributeSet attrs) {
class LunarThread extends Thread {
//...
private void doDraw(Canvas canvas) {
//do some drawing on the canvas
}
}
//...
public LunarView(Context context, AttributeSet attrs) {
super(context, attrs);
// ...
// create thread only; it's started in surfaceCreated()
thread = new LunarThread(holder, context, new Handler() {
@Override
public void handleMessage(Message m) {
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
});
//...
}
//...
}
如您所见,我们正在创建一个新线程,该线程正在渲染视图
为什么这段代码没有违反android框架线程的第二条规则
感谢阅读。线程没有呈现视图。我不完全确定它是如何工作的,但它使用处理程序向拥有视图的线程发送消息。LunarLander以与此示例相同的方式管理线程:我以前从未尝试过此代码。但我猜
handleMessage(messagem)
是在主(UI)线程中执行的。为了验证它,您可以添加一些代码进行检查
thread = new LunarThread(holder, context, new Handler() {
@Override
public void handleMessage(Message m) {
if (Thread.currentThread().getId() == 1) {
// main thread
}
else {
// other thread
}
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
});
您可以在另一个线程中渲染。这就是示例的全部要点:创建第二个线程,该线程将写入画布,然后将画布传输到MainUI。