什么没有在主线程上运行?

时间:2017-09-21 19:27:34

标签: android multithreading android-custom-view

鉴于下面简化的自定义视图,究竟是什么/没有在主线程上运行?

// 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是否都在一个单独的线程上运行?

1 个答案:

答案 0 :(得分:1)

这里唯一一个单独的线程是这个片段:

  public void run() {
    // Get SurfaceHolder -> Canvas
    //    clear canvas
    //    draw circle at point <x, y>

    // Do some IO?
    longRunningMethod();
}

其他所有内容都在您的主线上。所以从内部运行调用的任何东西都在你的新线程中。所以表面创建,销毁等都是主线程所以你的“运行”变量应该是锁定保护或易失性的,以确保你不会在错误的时间从单独的线程创建一个失序的竞争条件。

在longRunningMethod()完成后,请记住,除非你在其中放置一个循环以使其保持活动状态,否则不再运行该线程。