【问题标题】:Why does android not fall with the error "CalledFromWrongThreadException"? [duplicate]为什么android不会出现错误“CalledFromWrongThreadException”? [复制]
【发布时间】:2013-10-19 18:59:10
【问题描述】:

当我运行下面的代码时,应用程序不会崩溃:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    final Button b = (Button)findViewById(R.id.button1);
    new Mt(b).start();

}

并且此代码下降(当我单击 button1 时出现错误“CalledFromWrongThreadException”):

@Override
protected void onCreate(Bundle savedInstanceState) {
    ....
    final Button b = (Button)findViewById(R.id.button1);
    b.setOnClickListener(new Button.OnClickListener() {         
            @Override
            public void onClick(View v) {
                new Mt(b).start();
            }
        });

} 

Mt 类在哪里

class Mt extends Thread{
    Button b;
    Mt(Button b){
        this.b=b;
    }
    @Override
    public void run() {
        b.setText("4");
    }
}

为什么第一个示例没有出现错误“CalledFromWrongThreadException”?

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

    线程将在非 UI 线程中运行。 UI相关操作必须在UI线程中进行。修改thread.run()方法中的代码

    public void run() {
        runOnUiThread(new Runnable() {
    
           @Override
           public void run() {
           // TODO Auto-generated method stub
               b.setText("4");  
           }
       });
    
    }
    

    【讨论】:

    • 那么为什么第一个例子有效?
    • 因为您正在更改 OnClick 中按钮的文本。除非你点击按钮,否则线程不会启动。
    • 不过,两者都应该失败。无论如何,对按钮的访问都发生在单独的线程上。
    【解决方案2】:

    这只是一种预感,但第一个例子并没有失败,因为在onCreate的执行过程中没有UI。 setText 方法中不会检查线程访问,直到它实际计划更改用户可见的内容。由于尚未在屏幕上绘制任何内容,因此没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2023-04-04
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多