2013-04-22 71 views
0

我有需要運行異步任務作爲內部方法的對象(不在ui線程上),我想將ui線程傳遞給方法,然後在其上實現ui線程這樣的asynctask - 有沒有辦法做到這一點?確保在ui線程上運行異步線程

僞代碼:

 public class EditDetails extends Activity{   
       MyObject obj = new obj; 
       obj.syncWithServer(EditDetails.this); 
     } 

     public class MyObject { 
      public void syncWithWerver(EditDetails parent){ 
       final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> { 
         @Override 
         protected String doInBackground(String... params) { 
          return ""; 
         } 
         @Override 
         protected String onPostExecute(String result) { 
           //this doesn't run 
         } 
       } 
      } 
     }   

注:目前這是行不通的,因爲onPostExecute是不是doInBackground

編輯

這個代碼後進行燒製的僞代碼實際的問題仍然在發生,我已經列出http://pastebin.com/jW6JpUbghere ..基本上它在pastebin上運行72行之後卡住永不停止onPostExecute

回答

1

你有沒有嘗試執行你的任務是這樣?

parent.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      new GetUserHttpTask().execute(); 
     } 
}); 

我認爲這應該工作..

補充:

AsyncTask實現應該是如下: 注意:請閱讀更新的評論

class GetUserHttpTask extends AsyncTask<String/* in parameter for doInBackground */, Boolean /* in parameter for onProgressUpdate */, String /* Out parameter and in parameter for onPostExecute method*/> { 
    @Override 
    protected String doInBackground(String... params) { 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // this doesn't run 
    } 

    @Override 
    protected void onProgressUpdate(Boolean... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 
} 
+0

你應該像Boris提到的那樣改變'onPostExecute'方法的返回類型並且嘗試上面的代碼片段。它應該工作。 – 2013-04-22 11:48:41

+0

我已經添加了這個片段 - 我一直無法獲得onPostExecute運行,但結果發生在doInBackground中,所以沒關係我在那裏用結果響應中的「ok」代碼手動運行它 – user2083181 2013-04-22 13:08:05

2

奇怪的是onPostExecute應該是void。我想知道你的代碼是如何編譯的,因爲你已經改變了重寫方法的返回類型?

後您更正onPostExecute你可以得到AsyncTask運行如下:

final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> { 
     @Override 
     protected String doInBackground(String... params) { 
      return ""; 
     } 
     @Override 
     protected String onPostExecute(String result) { 
       // this will run 
     } 
} 
public void syncWithWerver(EditDetails parent){ 
    AsyncTask task = new GetUserHttpTask(); 
    task.execute(); 
} 
+1

@PareshMayani沒了,該方法總是返回void。參數類型已更改 – 2013-04-22 11:37:13

+0

@Perception如果我不認爲這是總體解決問題的關鍵,我會將其作爲註釋發佈。基本上他沒有正確地聲明'onPostExecute',所以不會被解僱。 – 2013-04-22 11:37:38

+1

@PareshMayani是@Boris是正確的。 'onPostExecute'的返回類型應該是'void'。 'String'的結果類型爲'doInBackground'方法,不適用於'onPostExecute'方法 – 2013-04-22 11:44:08