2016-04-11 12 views
0

İş parçacığı hiyerarşisi hakkında bir hatayla karşılaştım. Meselenin nerede olduğunu biliyorum, ancak bunun neden başıma geldiğini anlamak için yeterince anlamadım.Android Fatal İstisna Konuları Hiyerarşi (lütfen açıklayın)

benim temel kod olarak bu var:

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(); 
     } 
    }); 

Sonra setCameraSpace() yöntemi burada. Hiçbiri, View'un görünürlüğünü değiştirmek dışında, cevap için önemli değildir.

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(); 
    } 
} 

bu yüzden, ben parçacıkları hakkında emin değilim ve bir başlatıldığında/sona erdi ve ne kadar farklı yerlerde şeyler koymak.'daki UI öğeleri farklı, veri türü bir iş parçacığı içinde değil, çünkü bir run()?

neyse, ben bu hatayı alıyorum:

FATAL EXCEPTION: Timer-0 
Process: com.cleanercoding.cleanerphotobooth, PID: 14355 
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7647) 
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1107) 
at android.view.ViewGroup.invalidateChild(ViewGroup.java:5029) 
at android.view.View.invalidateInternal(View.java:12953) 
at android.view.View.invalidate(View.java:12917) 
at android.view.View.setFlags(View.java:10850) 
at android.view.View.setVisibility(View.java:7233) 
at android.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) 

cevap

1

Timer (http://developer.android.com/reference/java/util/Timer.html) belgelenmesi baktığımızda o Timer nesnesi o sırayla görevleri yerine getirme kendi iş parçacığı olduğu anlaşılıyor. Bu, UI'ye UI tarafından sahip olunan iş parçacığına değil, Timer'a ait olan iş parçacığından erişildiği anlamına gelir.

İplik kullanırken UI ile nasıl iletişim kurulacağı hakkında bilgi için http://developer.android.com/training/multiple-threads/communicate-ui.html'a bakın.