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