0

我使用的處理程序來獲取GCM值 我想在我的數據庫更新此值內誤差Looper.prepare()線程

所以我打電話的AsyncTask從處理程序

,但我得到這個錯誤

了java.lang.RuntimeException:無法內螺紋已不叫Looper.prepare創建處理程序()

我檢查了其他的解決辦法,他們說我必須把代碼中的run()的部分我已經做..

這是代碼,

private void GetGCM(final String UserID) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext()); 
       String gcmRegID = ""; 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456"); 

       // Update using Web Service 
       try { 
        UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask(); 


        updateGCMWSTask.execute(UserID, gcmRegID); 
        // ************ HERE IS THE ERROR *********************** 

       }catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 


      } catch (Exception bug) { 
       bug.printStackTrace(); 
      } 
     } 
    }); 


    thread.start(); 
} 
+0

我不太相信這個代碼特定部分需要一個明確的後臺線程所有... – dhke

+0

我一直在嘗試GCM代碼超過2個星期,這是我工作的唯一方式,現在我只想將代碼保存在數據庫中。 – asmgx

+0

正如我所說,我不明白爲什麼,但也許這是我的缺乏理解。 'GCMHelper'從哪裏來,它有什麼作用?它看起來像代碼嘗試在主(UI)線程上做一些同步操作。但是,如果你已經有一個工作線程,爲什麼額外的'AsyncTask'?或者但它簡短:我不明白,但不知怎的,它看起來不對。 – dhke

回答

1

在你的代碼添加Looper.prepare()和Looper.loop(),像這樣:

private void GetGCM(final String UserID) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Looper.prepare(); 
       GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext()); 
       String gcmRegID = ""; 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456"); 

       // Update using Web Service 
       try { 
        UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask(); 


        updateGCMWSTask.execute(UserID, gcmRegID); 
        // ************ HERE IS THE ERROR *********************** 

       }catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 

       Looper.loop(); 
      } catch (Exception bug) { 
       bug.printStackTrace(); 
      } 
     } 
    }); 

    thread.start(); 
} 
1

你不能一個線程中創建的AsyncTask。有幾種方式來處理它:

  1. 創建一個新的處理程序。

  2. 調用函數runOnUIThread活動。

  3. 使用廣播。

相關問題