2011-11-01 277 views
-1

我已經創建了一個異步任務是這樣的:異步任務

private class LongOperationcheckall extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String result="Start"; 
     try 
     { 
      Looper.myLooper().prepare(); 
      // Looper.loop(); 

      // TODO Auto-generated method stub 
      for(int k=0;k<13;k++) 
      { 
       checkall(); 
       this.publishProgress("Show the dialog"); 

       //count++; 
      } 

      result="Success"; 
      checkallcomp++; 

      OnscanComplete(); 
     } 
     catch(Exception ex) 
     { 
      checkallcomp++; 
      OnscanComplete(); 
     } 
     return result; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     Log.i("Progress", "Progressincheck"); 
    } 

    protected void onPostExecute(String params) { 
     Log.w("all Check",params); 

     // Execution of result of Long time consuming operation 
    } 
} 

我加入的代碼,

Looper.myLooper().prepare(); 

調用這個任務,因爲

taskAllcheck = new LongOperationcheckall(); 
taskAllcheck.execute(); 

第四次時,我第四次點擊開始按鈕,它給出了例外

無法創建內部線程的線程這不叫looper.prepare只有

,當我在設備運行執行模擬器OK內部處理,但之後添加此行,在錯誤出現因爲當我第四次單擊開始按鈕時,每個線程只能創建一個活套,並致電taskAllcheck.execute();

+0

checkall()方法做什麼? 「無法創建處理程序...」異常通常發生在您嘗試執行只允許在後臺線程中執行的操作時發生。 – Egor

+0

checkall()只檢查設置如開啓或關閉藍牙,gps在設備上或關閉,並根據它在數據庫中更新狀態 –

+0

這就是我所說的。也許,這些是必須在UI線程上執行的操作。你可以將它們放到activity.runOnUIThread()方法的Runnable中,這樣你就可以克服Looper異常。 – Egor

回答

-1

請把異步線程想象成一個UI線程,它有一個內置的處理程序來更新你的UI。無論如何,這是一條線索。所以現在已經清除了,我沒有看到你在哪裏寫了checkall()函數。檢查所有函數需要是異步任務在後臺調用的本地方法。它不能成爲你的主課堂中的一種方法。如果是這種情況,那麼就沒有任何異步任務的意義。所以請將checkall()函數添加到您的異步任務中。

接下來,在異步任務中不需要活套。數據的處理由以下處理:

this.publishProgress(「Show the dialog」);

請確保你傳入任何你想要的東西。可以是int,string,boolean,array或任何東西都可以在這裏處理。因此,明智地使用實施。

現在,相應地在onProgressUpdate()的內部進行設置,因此也請檢查是否要執行UI線程中的某些內容,如方法或其他內容。這可以用這種方法完成。

現在進行我已告訴您的更改。請回到我身邊,我會更好地與你合作。如果我們能指出問題。保重。

+0

感謝Peter的編輯。我會牢記在心。 – medampudi