2013-07-24 4 views
4

초보자이고 Android이고 Android UI Thread과 관련된 몇 가지 혼동이 있습니다. 이제는 UI를 만든 스레드와 별개로 스레드를 수정할 수 없다는 것을 알고 있습니다.UI 스레드 이해

좋아요.
약간 혼란스러워하는 첫 번째 Android 앱의 Activity입니다. 내가 원하는 건 뭐든지 할 수 있지만 onClick가되지 않도록


1 onCreate

public class NasaDailyImage extends Activity{ 
    public ProgressDialog modalDialog = null; 
//------------------------------------------------------------------------------ 
    @Override 
    protected void onCreate(Bundle savedInstanceState){ 

     //Instantiate progress dialog, skipping details. 

     Button b = //get reference to button 
     b.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       modalDialog.show(); // show modal 
       Toast.makeText(getApplicationContext(), "Getting feeds", 500).show(); 
       new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !! 
      } 
     }); 
    } 
//------------------------------------------------------------------------------ 
    public synchronized void resetDisplay(boolean parseErrorOccured, 
     boolean imageErrorOccured, 
     IotdHandler newFeeds){ 
     if(parseErrorOccured || imageErrorOccured){ 
      // make a Toast 
      // do not update display 
     }else{ 
      // make a Toast 
      // update display 
      // based on new feed 
     } 
    } 
//------------------------------------------------------------------------------ 
    class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{ 

     @Override 
     protected IotdHandler doInBackground(IotdHandler... arg0) { 
      IotdHandler handler = arg0[0]; 
      handler.processFeed(); // get the RSS feed data ! 
      return handler; 
     } 
//------------------------------------------------------------------------------  
     @Override 
     protected void onPostExecute(IotdHandler fromInBackground){ 
      resetDisplay(// call to update the display 
      fromInBackground.errorOccured, 
      fromInBackground.imageError, 
      fromInBackground); 
     } 
//------------------------------------------------------------------------------ 


} 
는 UI 스레드에 있습니다. 왜 그 방법으로 ProgressDialogToast을 만들 수 있습니까? 왜 오류가 없습니까?
2. AsyncTaskNasaDailyImage의 하위 클래스입니다. 즉, 모두 NasaDailyImage의 방법을 사용하여 디스플레이를 업데이트하는 resetDisplay()을 액세스 할 수 있습니다. resetDisplay()은 UI와는 다른 스레드에서 실행되는 onPostExecute에서 호출됩니다. 그렇다면 왜 디스플레이를 업데이트 할 수 있습니까?

+0

'onClick'와'UI 스레드에 onPostExecute' 모두 실행됩니다. 당신의 코드에서'doInBackground'는 그 이름에서 알 수 있듯이 백그라운드 스레드에서만 실행됩니다. – Geobits

+0

@Geobits AFAIK, 이것은 이벤트가 ** 다른 스레드 **에서 처리 된 이전 자바와 다릅니다. UI는 하나의 스레드 였고 이벤트 처리는 다른 스레드에서 발생했습니다 –

+0

다음을 통해 읽으십시오. http://stackoverflow.com/a/3653478/752320 – Geobits

답변

3
  1. onClick()은 실제로 UI 스레드에 있습니다. 액티비티에서 발생하는 대부분의 작업은 UI 스레드에서 발생합니다.

  2. onPostExecte() (및 그에 대응하는 onPreExecute())도 UI 스레드에서 실행됩니다. AsyncTask.onPostExecte() documentation에 명확하게 나와 있습니다. AsyncTask는 의도적으로 개발자가 백그라운드 작업을하기 전후에 UI를 업데이트 할 수 있도록 설계되었습니다.

일반적으로 달리 명시하지 않는 한 코드는 UI 스레드에서 실행됩니다. AsyncTasks, Runnables 또는 Threads를 작성한 후에는 코드가 실행되는 위치를 확실히 이해해야합니다. 액티비티에서는 일반적으로 UI 스레드에 있다고 가정하는 것이 안전합니다.

+0

AFAIK, 이것은 다른 스레드에서 이벤트가 처리 된 이전 자바와 다릅니다. UI가 하나의 스레드 였고 이벤트 처리가 다른 스레드에 발생했습니다 –

+0

"이전 Java"및 "이벤트"는 무엇을 의미합니까?"당신은 안드로이드의 소스를 읽는다면, 모든'의 onclick()가'"이벤트 "는 것은 인터페이스의 방법이다. 이벤트는 정말 특별한 것은 없습니다. –

+0

내 말은'addActionListener'가 다른 스레드에서 처리 된 권리? –

0
  1. 비동기 태스크 클래스가 순차 메소드를 자동으로 호출하는 AsyncTask 클래스를 확장하고 있습니다. 먼저 onPreExecute이고 doBackground이고 마지막으로 onPost입니다. 사용자가 원하는 변경 사항을 변경하려면 onProgressUpdate 메소드를 사용할 수 있습니다.

  2. 귀하의 활동 등급을 사용하려면 간단한 전화 activityclass.this.resetDisplay()을 사용하십시오. 내부 클래스 범위가 글로벌 변수를 제외하고 때때로 통합에 실패했기 때문입니다.

감사