2025-05-23

 

new Thread() 

    public void run() 

    { 

             ….. 

     } 

}.start(); 

 

如果在上述代碼中省略號處面創建一個Dialog的話會出現Can't create handle inside thread這樣的錯誤,所以改用下述message形式的,下述是一個開發項目中具體的例子。

 

private void showStatusDialogThread() { 

        mHandler = new Handler() { 

            @Override 

            public void handleMessage(Message msg) { 

                if (status != null) { 

                    if (status.equals(SyncStatus.Success)) { 

                        // 更新本地保存的lastSyncTime為當前時間 

                        UpdateLocalLastSyncTime(System.currentTimeMillis()); 

                    } 

                    showStatusDialog(status); 

                    mHandler.removeCallbacks(mRunnable); 

                } 

                super.handleMessage(msg); 

            } 

        }; 

        mRunnable = new Runnable() { 

            @Override 

            public void run() { 

                mHandler.postDelayed(this, 100); 

                Message message = new Message(); 

                mHandler.sendMessage(message); 

            } 

        }; 

        mHandler.post(mRunnable); 

    } 

 

其中

 

showStatusDialog(status); 

是調用一個顯示Dialog的自定義的方法。

這種發送message的方式模型抽取出來就是下面的形式:

 

        mHandler = new Handler() { 

            @Override 

            public void handleMessage(Message msg) { 

                //執行的具體方法,例如創建Dialog,計數等 

                                …… 

                super.handleMessage(msg); 

            } 

        }; 

        mRunnable = new Runnable() { 

            @Override 

            public void run() { 

                //設置延遲時間間隔 

                mHandler.postDelayed(this, 100); 

                Message message = new Message(); 

                mHandler.sendMessage(message); 

            } 

        }; 

        mHandler.post(mRunnable); 

    } 

 

 

 

然後在其他某處調用

 

mHandler.removeCallbacks(mRunnable); 

 

就可取消此message的發送。

其實這裡發送message也是一種線程,相當於設置一個定時器,每隔一段時間執行某些代碼一樣。

摘自: cangkukuaimanle的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *