Search

Android - WeakReference 與多執行緒的 Handler

2015-07-23 1:59 PM

the handler class should be static or leaks might occur

Android 在使用多執行緒搭配 UI 元件操作時

我們必須使用 Handler 搭配 Thread 以便繞過 Android 不可在 UI Thread 以外執行 UI 操作的限制

這個警告便表示 Handler 應該宣告為 static 以免程式發生無法預期的問題

但宣告為 static 又無法呼叫 Activity 內的 function 該如何是好?

這時就必須要用到 weakreference 這個類別的設計方法

如此即可在 Handler 內存取 Activity 的成員

若想知道多執行緒如何與 Handler 搭配使用可以查看 Multi-thread 多執行緒與 UI 更新操作 這篇文章

程式碼範例
private SSHThreadHandler sshHandler = new SSHThreadHandler(this);

private static class SSHThreadHandler extends Handler{

 // 與 MainActivity 的 WeakReference 變數
 private WeakReference<MainActivity> refActivity;

 // 藉由 new 物件時傳入的 activity 參數建立 WeakReference
 public SSHThreadHandler(MainActivity activity) {
     refActivity = new WeakReference<MainActivity>(activity);
 }

 @Override
 public void handleMessage(Message message){
     // 取得 MainActivity
     MainActivity    activity = refActivity.get();
     // 取得 MainActivity 內的成員
     ISSHConnection  sshConnection = activity.getSshConnection();
     // 取得 UI 物件
     TextView        redirectPageStatus = activity.getRedirectPageStatus();

     switch(message.what){
         case ISSHConnection.waitingUsername:
             sshConnection.inputUsername();
             redirectPageStatus.setText( "連線中... 快好囉~" );
             break;
         case ISSHConnection.waitingPassword:
             sshConnection.inputPassword();
             break;
         case ISSHConnection.waitingDuplicateConfirm:
             activity.showDuplicateLoginAlert();
             break;
         case ISSHConnection.waitingContinueConfirm:
             sshConnection.doContinue();
             redirectPageStatus.setText( "歡迎回來 " + sshConnection.getUsername() );
             break;
         case ISSHConnection.menuPage:
             activity.hideLoginPageFrame();
             activity.hideLoadingFrame();
             activity.showMenuPageHolder();
             break;
     }
 }
}
各項資料連結
Android - Multi-thread 多執行緒與 UI 更新操作
WeakReference

No comments:

Post a Comment