close
Blogtrottr
海芋小站
提供實用軟體教學,介紹有趣網站及資訊,豐富電腦人生 
[Android 開發] This message is already in use 解法
Oct 31st 2014, 11:16, by 張海芋

Handler 和 Message 是 Android 用來更新畫面的重要方法,有在開發 Android 的朋友都應該要知道這兩個的用法。而海芋最近使用這個方法來開發程式時,碰到了「android.util.AndroidRuntimeException: This message is already in use」這個問題,這是原本的寫法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private int MSG_INCREASE_PROGRESSBAR = 9527;
private int MSG_Done = 5566;
private ProgressDialog m_progressDialog = null;
private Runnable m_runnable = new Runnable(){
 @Override
 public void run() 
 {
   try 
   {
      Message msg = new Message();
      for (int i = 0; i < 100; i++)
      {
        msg.what = MSG_INCREASE_PROGRESSBAR;
        m_Handler.sendMessage(msg);
      }
 
      msg.what = MSG_Done;
      m_Handler.sendMessage(msg);
    }catch (Exception e) {
      e.printStackTrace();
    }
 } 
};
 
private Handler m_Handler = new Handler()
{
 @Override
 public void handleMessage(Message msg) 
 {
     super.handleMessage(msg);
     switch (msg.what)
     {
       case MSG_INCREASE_PROGRESSBAR:
         if (m_progressDialog != null)
           m_progressDialog.incrementProgressBy(1);
         break;
       case MSG_DelteDone:
         if (m_progressDialog != null)
         {
           m_progressDialog.dismiss(); 
           m_progressDialog = null; 
         }
        break;
     } 
 } 
};

出現這個問題,海芋就去追查一下 Handler 這個 Class,原來在 Handler SendMessage 後,Handler 會將 Message 加入 MessageQueue 中,造成原本要處理的對象,已經不是原來的對象所致,所以要解決這個問題,必須在每次傳送 Message 給 Handler 前,先 New 一個 Message 元件,所以改成以下的寫法就可以囉!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private int MSG_INCREASE_PROGRESSBAR = 9527;
private int MSG_Done = 5566;
private ProgressDialog m_progressDialog = null;
private Runnable m_runnable = new Runnable(){
 @Override
 public void run() 
 {
     try 
     {
       for (int i = 0; i < 100; i++)
       {
         Message msg = new Message();
         msg.what = MSG_INCREASE_PROGRESSBAR;
         m_Handler.sendMessage(msg);
       }
      Message msg = new Message();
      msg.what = MSG_Done;
      m_Handler.sendMessage(msg);
    }catch (Exception e) {
      e.printStackTrace();
    }
 } 
};
 
private Handler m_Handler = new Handler()
{
 @Override
 public void handleMessage(Message msg) 
 {
    super.handleMessage(msg);
    switch (msg.what)
    {
      case MSG_INCREASE_PROGRESSBAR:
        if (m_progressDialog != null)
          m_progressDialog.incrementProgressBy(1);
        break;
      case MSG_DelteDone:
        if (m_progressDialog != null)
        {
           m_progressDialog.dismiss(); 
           m_progressDialog = null; 
         }
         break;
      }
 } 
};
留言回應 或者 訂閱 RSS feed 以獲得更多的文章更新資訊。若有商業上的需求,也歡迎透過 合作提案 與我聯絡。本站文章非經授權請勿「全文轉貼」,引用時請註明來源,謝謝。

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.

You are receiving this email because you subscribed to this feed at blogtrottr.com.

If you no longer wish to receive these emails, you can unsubscribe from this feed, or manage all your subscriptions
arrow
arrow
    全站熱搜

    slw2 發表在 痞客邦 留言(0) 人氣()