2010-03-26 95 views
0

我正在研究一個小應用程序來嘗試我擁有的想法。這個想法是在發生某種事件時定期更新用戶界面。在我創建的演示中,我每2秒更新一次ProgressDialog,持續15回合。使用線程更新UI事件的UI

我遇到的問題,我不太明白的是,當一個事件被處理時,我發送一個消息給應該更新ProgressDialog消息的處理程序。但是,當發生這種情況時,我得到一個異常,指出我無法從該線程更新UI。

下面的代碼出現在我的活動:

ProgressDialog diag; 
String diagMessage = "Started loading..."; 

final static int MESSAGE_DATA_RECEIVED = 0; 
final static int MESSAGE_RECEIVE_COMPLETED = 1; 


final Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg){ 
     diag.setMessage(diagMessage); 

     switch(msg.what){ 
      case MESSAGE_DATA_RECEIVED: 

       break; 
      case MESSAGE_RECEIVE_COMPLETED: 
       dismissDialog(); 
       killDialog(); 
       break; 
     } 
    } 
}; 

Boolean isRunning = false; 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setupDialog(); 
    if(isRunning){ 
     showDialog(); 
    } 

    setContentView(R.layout.main); 


} 

void setupDialog(){ 
    if(diag == null){ 
     diag = new ProgressDialog(ThreadLoading.this); 
     diag.setMessage(diagMessage); 
    } 
} 

void showDialog(){ 
    isRunning = true; 
    if(diag != null && !diag.isShowing()){ 
     diag.show(); 
    } 
} 

void dismissDialog(){ 
    if(diag != null && diag.isShowing()){ 
     diag.dismiss(); 
    } 
} 

void killDialog(){ 
    isRunning = false; 
} 

public void onStart(){ 
    super.onStart(); 

    showDialog(); 



    Thread background = new Thread(new Runnable(){ 
     public void run(){ 
      try{ 
       final ThreadRunner tr = new ThreadRunner(); 
       tr.setOnDataReceivedListener(new ThreadRunner.OnDataReceivedListener(){ 
        public void onDataReceived(String message){ 
         diagMessage = message; 
         handler.handleMessage(handler.obtainMessage(MESSAGE_DATA_RECEIVED)); 
        } 
       }); 

       tr.setOnDataDownloadCompletedEventListener(new ThreadRunner.OnDataDownloadCompletedListener(){ 
        public void onDataDownloadCompleted(String message){ 
         diagMessage = message; 
         handler.handleMessage(handler.obtainMessage(MESSAGE_RECEIVE_COMPLETED)); 
        } 
       }); 

       tr.runProcess(); 
      } 
      catch(Throwable t){ 
       throw new RuntimeException(t); 
      } 
     } 
    }); 

    background.start(); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    dismissDialog(); 
} 

出於好奇的緣故,這裏的ThreadRunner類的代碼:

public interface OnDataReceivedListener { 
    public void onDataReceived(String message); 
} 

public interface OnDataDownloadCompletedListener { 
    public void onDataDownloadCompleted(String message); 
} 

private OnDataReceivedListener onDataReceivedEventListener; 
private OnDataDownloadCompletedListener onDataDownloadCompletedEventListener; 


int maxLoop = 15; 
int loopCount = 0; 
int sleepTime = 2000; 

public void setOnDataReceivedListener(OnDataReceivedListener onDataReceivedListener){ 
    this.onDataReceivedEventListener = onDataReceivedListener; 
} 

public void setOnDataDownloadCompletedEventListener(OnDataDownloadCompletedListener onDataDownloadCompletedListener){ 
    this.onDataDownloadCompletedEventListener = onDataDownloadCompletedListener; 
} 

public void runProcess(){ 
    for(loopCount = 0; loopCount < maxLoop; loopCount++){ 
     try{ 
      Thread.sleep(sleepTime); 
      onDataReceivedEventListener.onDataReceived(Integer.toString(loopCount)); 
     } 
     catch(Throwable t){ 
      throw new RuntimeException(t); 
     } 
    } 

    onDataDownloadCompletedEventListener.onDataDownloadCompleted("Download is completed"); 
} 

我缺少的東西?邏輯對我來說是有意義的,它看起來像一切都應該工作,我使用一個處理程序來更新UI,如推薦。

任何幫助將不勝感激。

感謝, 泰隆

附:我正在開發Android 1.5

+0

看看AsynTask類時,你得到的時間;它使得線程無痛(以損失一些控制權爲代價) – Samuh

+0

謝謝,我早些時候對它進行了簡要介紹,但並未深入研究它。基本上我試圖做的,不是與這個代碼,但是有一個ListView一次加載大約3/4項。類似於市場應用程序。 – johnnynotsolucky

回答

0

我發現了這個問題。將我的代碼與其他代碼非常相似後,發現以下小問題:

處理程序。 handleMessage(handler.obtainMessage(MESSAGE_RECEIVE_COMPLETED));

實際上應該是:

處理程序。 sendMessage(handler.obtainMessage(MESSAGE_RECEIVE_COMPLETED));

希望有人認爲這有用的,從我的錯誤:)

問候, 泰隆學習