鉴于下面简化的自定义视图,究竟是什么/没有在主线程上运行?
// MainActivity
protected void onCreate(Bundle bundle) {
// ...
CustomView customView = new CustomView(this);
setContentView(customView);
customView.setOnTouchListener((v, event) -> {
customView.setPoint(event.getX(), event.getY());
});
}
public class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
protected Thread thread;
private boolean running;
private int x;
private int y;
public CustomView(Context context) {
super(context);
thread = new Thread(this);
}
public void run() {
// Get SurfaceHolder -> Canvas
// clear canvas
// draw circle at point <x, y>
// Do some IO?
longRunningMethod();
}
public void surfaceCreated(SurfaceHolder holder) {
running = true;
thread.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
running = false;
}
public void setPoint(int x, int y) {
this.x = x;
this.y = y;
run();
}
private void longRunningMethod(){
// ...
}
}
所有CustomView
是否都在一个单独的线程上运行?
答案 0 :(得分:1)
这里唯一一个单独的线程是这个片段:
public void run() {
// Get SurfaceHolder -> Canvas
// clear canvas
// draw circle at point <x, y>
// Do some IO?
longRunningMethod();
}
其他所有内容都在您的主线上。所以从内部运行调用的任何东西都在你的新线程中。所以表面创建,销毁等都是主线程所以你的“运行”变量应该是锁定保护或易失性的,以确保你不会在错误的时间从单独的线程创建一个失序的竞争条件。
在longRunningMethod()完成后,请记住,除非你在其中放置一个循环以使其保持活动状态,否则不再运行该线程。