【问题标题】:CalledFromWrongThreadExceptionCalledFromWrongThreadException
【发布时间】:2010-08-05 09:52:02
【问题描述】:
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final ThraedDemo objDemo = new ThraedDemo();
    Thread objThread = new Thread() {

        @Override
        public void run() {

            objDemo.firstMethod();
        }
    };
    objThread.start();
}


class ThraedDemo {

        private void firstMethod() {
            Thread objThread = new Thread() {

                @Override
                public void run() {
                    try {
                    ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n]);

                        Thread.sleep(10000);
                        Log.v("Thread","1111111111111111sleep");
                    } catch (InterruptedException ex) {
                        System.out.println("interuped exception" + ex.getMessage());
                    }
                    secondMethod();
                }

                private void secondMethod() {
        Thread objThread = new Thread() {

            @Override
            public void run() {
                try {
                ((ImageView)findViewById(R.id.ImageViewResult)).setImageResource(nums[n+1]);

                n++;

                    Thread.sleep(10000);
                   Log.v("Thread","22222222222 sleep");
                } catch (InterruptedException ex) {
                    System.out.println("interuped exception" + ex.getMessage());
                }
                firstMethod();
            }
        };
        objThread.start();
    }

            };
            objThread.start();
        }

    }

我使用上面的代码,但它没有运行。它得到CalledFromWrongThreadException上面的代码有什么问题。请给我一些建议。提前谢谢

【问题讨论】:

标签: android


【解决方案1】:

我认为您不能从 UI 线程以外的其他线程进行视图修改,因此要么在 oncreate 中创建 handlers 并将您的线程发布到它,要么使用 AsyncTaskrunOnUIThread 方法发送部分代码直接发送到 UI 线程。

【讨论】:

  • 如果您希望您的 2 个线程一个接一个地执行,为什么不简单地将您的 2 个线程发布到同一个处理程序?
  • “与您的问题有关” - 那么您的问题是什么?我认为Sephy在文本中对您唯一的问题给出了适当的答案。更具体。
  • 感谢您对 Sephy 的回复,以及我们如何在处理程序中使用 2 个线程。给我一些示例代码。
【解决方案2】:

我编辑了你的第二个函数代码,我看到你的代码是永远循环的,导致 firstMethod 调用 secondMethod 和 secondMethod 调用新的 firstMethod 开始然后永远循环。我删除它并将代码更新 ImageView 移动到 UI 线程中,你可以试试这个:

class ThraedDemo {

    private void firstMethod() {
        Thread objThread = new Thread() {
            @Override
            public void run() {
                try {
                    runOnUiThread(new Runnable() {
                        public void run(){ 
                            ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n]);  
                        }
                    });
                    Thread.sleep(10000);
                    Log.v("Thread","1111111111111111sleep");
                } catch (InterruptedException ex) {
                    System.out.println("interuped exception" + ex.getMessage());
                }
                secondMethod();
            }
        };
        objThread.start();
    }

    private void secondMethod() {
        Thread objThread2 = new Thread() {

            @Override
            public void run() {
                try {
                    runOnUiThread(new Runnable() {
                        public void run(){ 
                            ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n+1]);  
                        }
                    });
                    n++;
                    Thread.sleep(10000);
                    Log.v("Thread","22222222222 sleep");
                } catch (InterruptedException ex) {
                    System.out.println("interuped exception" + ex.getMessage());
                }
            }
        };
        objThread2.start();
    }
}

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-05-08
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多