2012-12-13 61 views
-3

我使用的AsyncTask功能 內如何返回一個值時,異步執行完成,因爲我不能在這裏使用PostExecute方法的Android的AsyncTask PostExecute

AsyncTask.execute(new Runnable() { 
      public void run() {}} 

繼承人的代碼。 我需要從SpinnerList中檢索值以在主線程上使用em。 但是,通常當我要求數據時,我會得到空值,因爲它沒有返回值。

AsyncTask.execute(new Runnable() { 
      public void run() { 
       try{ 
        String fql = "SELECT uid, name FROM user WHERE is_app_user AND uid IN (SELECT uid2 FROM friend WHERE uid1 = me())"; 
        Bundle parameters = new Bundle(); 

        parameters.putString("query", fql); 
        parameters.putString("method", "fql.query"); 
        parameters.putString("access_token", fb.getAccessToken()); 
        String Response = fb.request(parameters); 
        JSONArray json = new JSONArray(Response); 
        list = new ArrayList<String[][]>(); 
        String[][] friendsToList = new String[1][2]; 
        SpinnerList = new ArrayList<String>(); 
        String TempToSpinnerList=new String(); 
        for(int i = 0; i < json.length(); ++i){ 
         friendsToList[0][0] = json.getJSONObject(i).getString("uid"); 
         friendsToList[0][1] = json.getJSONObject(i).getString("name"); 
         TempToSpinnerList= friendsToList[0][1]; 
          list.add(friendsToList); 
          SpinnerList.add(TempToSpinnerList); 
          Log.e("Test"," "+friendsToList[0][1]+" "+friendsToList[0][0]); 
         } 


         //dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
         //spinner.setAdapter(dataAdapter); 



    /* jsonUser = fb.request(parameters); 
     friendObj = Util.parseJson(jsonUser); 

     friendArray = friendObj.getJSONArray("data"); 

     // 
     friendlist = new ArrayList<String[][]>(); 
     String[][] friendsToList = new String[1][2]; 
     int friendCount = 0; 
     String fId, fNm; 
     JSONObject friend; 
     for (int i = 0;i<friendArray.length();i++){ 
      //Get a JSONObject from the JSONArray 
      friend = friendArray.getJSONObject(i); 
      //Extract the strings from the JSONObject 
      friendsToList[0][0] = friend.getString("id"); 
      friendsToList[0][1] = friend.getString("name"); 
      friendlist.add(friendsToList); 
      //Set the values to our arrays 
     Log.e("Tester",""+ friendsToList[0][0]+" "+ friendsToList[0][1]); 
      friendCount ++;}*/ 
      } 
       catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (FacebookError e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      }}); 
+0

我們不能告訴你問什麼,你應該詳細說明。你想做什麼?你有什麼嘗試? – dmon

+0

爲了更好的描述發佈您的所有AsyncTask函數,還可以在AsyncTask的onPostExecute方法中分配值。 – kabuto178

+0

這是一個過時的Android方法,在一個新線程中執行任務...請使用AsyncTask在下面看到我的帖子,並將所有內容移動到您的'try {}'塊中以在我的代碼中的'doInBackground'函數內... – jamis0n

回答

4

如果您想在Asynctask完成後執行某個功能,您可以在調用活動中設置回調函數。在AsyncTask類中創建一個構造函數並將其傳遞給調用活動。然後使用此引用在任務完成時調用回調函數。

您也可以從onPostExecute內更新UI,如果它適合您,它更簡單。

public class MyTask extends AsyncTask<String, Void, String> 
{ 
    private MainActivity activity; 

    public MyTask(MainActivity activity) { 
     this.activity = activity; 
    } 
    @Override 
    protected Void doInBackground(String... params) { 
     //Do background stuff 
    } 

    protected void onPostExecute() { 
     //dismiss progress dialog if needed 
     //Callback function in MainActivity to indicate task is done 
     activity.taskDone("some string"); 
    } 
} 

MainActivity.java

//Pass your params array and the current activity to the AsyncTask 
new MyTask(MainActivity.this).execute(params); 

//Callback for AsyncTask to call when its completed 
public void taskDone(String returnVal) { 
    //Do stuff once data has been loaded 
    returnText = returnVal; 
} 
+0

這裏有一個相關的問題,當onPostExecute運行時,是否需要防止調用活動爲空(由於用戶交互或其他原因而被Android銷燬)?我計劃添加這樣的代碼來禁用UI EditText,直到通過AsyncTask設置應用程序的數據庫。在onPostExecute中,我打算調用回調來啓用EditText。這個EditText應該只在數據庫配置完成後才能交互。我是否需要擔心調用活動爲空? – Mike

1

您不從AsyncTasks返回值。你需要傳入任何你想改變的AsyncTask和onPostExecute()你可以改變它的值。請發佈更多代碼並更好地解釋您的場景以獲得完整答案。

編輯:正如Jamis0n所述,AsyncTask計算的值可以使用get()方法「獲得」。

+1

這不完全是真的...... doInBackground的返回值可以通過'new myTask()。execute(params).get();'來獲得,儘管它並不是推薦的,因爲它會連接主UI。上面的解決方案在呼叫活動中使用回調函數,這聽起來像OP所要求的那樣。 – jamis0n

+0

真實,好的一點。 – span

+1

雖然我有點後悔指出,因爲我不會自己使用它! – jamis0n