【问题标题】:Is there any problem with this code?这段代码有问题吗?
【发布时间】:2011-07-07 16:57:15
【问题描述】:

当我按下搜索按钮时,它会产生意外停止的问题。

public class beautiful extends Activity {
    ImageView radar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
      this.requestWindowFeature(Window.FEATURE_NO_TITLE);
      this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.beautiful);

    radar = (ImageView) findViewById(R.id.radar);
    Button search = (Button) findViewById(R.id.magnifier);
    ImageView text = (ImageView) findViewById(R.id.text);
    MediaPlayer siren = MediaPlayer.create(this, R.raw.siren);

    search.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Thread counter = new Thread(new Runnable(){

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try{
                        Thread.sleep(2000);
                        radar.setImageResource(R.drawable.radar_new_full);
                        Thread.sleep(3000);
                        radar.setImageResource(R.drawable.radar_new_50);
                        Thread.sleep(2000);
                        radar.setImageResource(R.drawable.radar_new_found);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    finally{

                    }
                }

            });
            counter.start();
        }
    });
}

以下是 LogCat 警告:

07-07 17:36:17.298: WARN/dalvikvm(274): threadid=15: 线程以未捕获的异常退出 (group=0x4001b188) 07-07 17:36:17.306:错误/AndroidRuntime(274):未捕获的处理程序:线程 Thread-8 由于未捕获的异常而退出 07-07 17:36:17.306: 错误/AndroidRuntime(274): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸其视图。 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.ViewRoot.checkThread(ViewRoot.java:2683) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.ViewRoot.requestLayout(ViewRoot.java:557) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.View.requestLayout(View.java:7918) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.View.requestLayout(View.java:7918) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.View.requestLayout(View.java:7918) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.view.View.requestLayout(View.java:7918) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 android.widget.ImageView.setImageResource(ImageView.java:271) 07-07 17:36:17.306: 错误/AndroidRuntime(274): 在 example.beautiful$1$1.run(beautiful.java:46) 07-07 17:36:17.306: 错误/AndroidRuntime(274): at java.lang.Thread.run(Thread.java:1096)

【问题讨论】:

  • 始终粘贴所有相关的 LogCat 输出以查找您需要帮助的任何错误。有些人可能能够通过观察您的代码来找出问题所在,但是阅读您的错误日志(它专门告诉您什么是错误的)要容易得多。这可以在 Eclipse 的“LogCat”视图中查看。
  • 谢谢,看看 gopal 的回答。您正在从非 UI 线程调用 UI 方法 (setimageresource)。 “只有创建视图层次结构的原始线程才能接触其视图”
  • 好的,谢谢。我读了。最大的问题是我对这个 AsyncTask 不太了解。只有下载图片的例子,我不需要。谢谢

标签: android


【解决方案1】:

阅读 ANR 对话框 link 以及如何从其他线程 Painless Threading 更新 UI

【讨论】:

    【解决方案2】:

    尝试删除 public void run() 上方的 @Override

    【讨论】:

    • 试过了,还是一样:(谢谢
    【解决方案3】:

    在这里和那里放置一些打印语句或断点,无论你喜欢哪个。 追踪导致错误的那一行,尝试在其周围放置 try-catch 语句以清楚地了解错误是什么 - 然后更容易解决错误(短暂调试)

    • 只是一个建议

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      //do sth...
      }
      

      【讨论】:

      • 捆绑 saveInstanceState != 捆绑冰柱?
      • 我更喜欢你使用 Bundle icicle 因为它在 UI 模式下比 saveInstanceState 更有用,这是我的个人经验。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2014-05-11
      • 1970-01-01
      • 2015-04-25
      • 2018-09-09
      相关资源
      最近更新 更多