有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android致命异常线程层次结构(请解释)

我遇到了一个关于线程层次结构的错误。我知道问题出在哪里,但我对线程的理解还不足以理解为什么会发生这种情况

我的基本代码是:

public class CameraPage extends Activity implements ImageSaver.OnImageSavedListener {
    public int numPics = 0;
    public Timer gifTimer;

    protected void onCreate(Bundle savedInstanceState) {
        gif_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                countdownTimer = new CountDownTimer((seconds * 1000 + 500), 1000) {
                public void onTick(long millisUntilFinished) {
                    // Do things
                }
                public void onFinish() {
                    numPics = 0;
                    gifTimer = new Timer();
                    gifTimer.scheduleAtFixedRate(new TimerTask(){
                        @Override
                        public void run(){
                            numPics++;
                            if(numPics <= 5) {
                                Log.d("********", "Take a picture " + numPics);
                            } else {
                                gifTimer.cancel();
                                Log.d("********", "No More Pictures " + numPics);
                                setCameraSpace();
                            }
                        }
                    },0,500);
                }
            }.start();
         }  
    });

那么setCameraSpace()的方法就在这里。除了更改任何View的可见性之外,它所做的一切对答案都不重要

public void setCameraSpace(){
    Log.d("***********", "Finish " + bitmapArray);

    if (icon_alert_int == 1) {
        icon_alert.setVisibility(View.VISIBLE);
    } else {
        icon_alert.setVisibility(View.GONE);
    }
    if(gallery){
        gallery_button.setVisibility(View.VISIBLE);
    } else {
        gallery_button.setVisibility(View.GONE);
    }
    camera_preview_container.setVisibility(View.GONE);
    countdown_timer.setVisibility(View.GONE);
    picture_button.setVisibility(View.VISIBLE);
    back_button.setVisibility(View.VISIBLE);
    front_flash.setVisibility(View.GONE);
    front_flash.setAlpha(0f);
    countdown_timer.setText("");
    camera_text.setText(pref_session_start_inp);

    if (pref_session_auto_live_view) {
        //Countdown until Live view reappears
        live_view_timer = new CountDownTimer((pref_session_auto_live_view_inp * 1000 + 50), 1000) {
            public void onTick(long millisUntilFinished) {
                auto_live_view_text.setText("" + ((millisUntilFinished / 1000) - 1));
            }

            public void onFinish() {
                latest_picture_container.setVisibility(View.GONE);
                camera_preview_container.setVisibility(View.VISIBLE);
                auto_live_view_text.setText(String.valueOf(pref_session_auto_live_view_inp));
                camera_text.setText(pref_session_start_inp);
            }
        }.start();
    }
}

因此,我不确定线程以及线程的开始/结束时间,以及如何将线程放在不同的位置。我假设setCameraSpace()中的UI元素不在不同的数据类型线程中,因为它在run()

无论如何,我得到了这个错误:

FATAL EXCEPTION: Timer-0
Process: com.cleanercoding.cleanerphotobooth, PID: 14355
安卓.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at 安卓.view.ViewRootImpl.checkThread(ViewRootImpl.java:7647)
at 安卓.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1107)
at 安卓.view.ViewGroup.invalidateChild(ViewGroup.java:5029)
at 安卓.view.View.invalidateInternal(View.java:12953)
at 安卓.view.View.invalidate(View.java:12917)
at 安卓.view.View.setFlags(View.java:10850)
at 安卓.view.View.setVisibility(View.java:7233)
at 安卓.widget.ImageView.setVisibility(ImageView.java:1420)
at com.cleanercoding.cleanerphotobooth.CameraPage.setCameraSpace(CameraPage.java:1263)
at com.cleanercoding.cleanerphotobooth.CameraPage$6$2$1.run(CameraPage.java:552)
at java.util.Timer$TimerImpl.run(Timer.java:284)

共 (1) 个答案