2017-08-03 37 views
0

這是我的問題。我創建了一個asyncTask鏈接到我的數據庫並使用JSON發送和接收信息。AsyncTask - 如何在onPostExecute之後將值傳遞迴活動類?

@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 

    progressDialog.dismiss(); 
    returnValues = dataParsed.split("\\s+"); 

    mainActivity.getValue(this is the function that calls anotherfunction in 
    asyncTask) 

    Log.v("ARRAY LENGTH", String.valueOf(returnValues.length)); 
} 

public String[] returnmyString(){ 
    //return mySaveData; 
    Log.v("ARRAY LENGTH 2", String.valueOf(returnValues.length)); 
    return returnValues; 
} 

我在基於活動的類中創建asyncTask對象,然後調用該object.execute。我的問題是,我的代碼將繼續運行,一旦調用object.execute並且其中一行在執行完所有代碼之前調用asyncTask類中的函數。

process.activitySave(1); //<---Process is the object for the asyncTask class 
process.ContextSave(this,ServerURLSource,myParameters); 
process.execute() 
changedData = process.returnmyString(); //<-- this is the line of code that gets implemented that returns a null value 

我試圖創建在的AsyncTask類Mainactivity對象,然後調用一個函數,然後當我這樣做檢索的價值,但我的應用程序崩潰。任何幫助,將不勝感激。我想在mainactivity類中添加某種監聽器,因爲它似乎無法在我的asyncTask類中引用mainactivity類中的任何函數。

這是的AsyncTask內的函數返回值:

public String[] returnmyString(){ 
    //return mySaveData; 
    Log.v("ARRAY LENGTH", String.valueOf(returnValues.length)); 
    return returnValues; 
} 
+0

你需要一個回調方法。當任務x完成時,將結果傳遞給活動,方法是將反饋作爲參數 – Zoe

+0

嘿,你可以進一步解釋這種類型的功能嗎?任務x將是process.execute,但是我會使用哪種回調方法,以及我將它放在哪裏?那麼我會用什麼樣的方法來獲得反饋? – RW6

+0

你爲什麼不簡單地將'changedData'設置到'onPostExecute' @ RW6? onPostExecute方法在您調用#execute方法的相同線程上運行。 – tolpp

回答

1

方法1是基本,匿名內部類實現。由於內部AsyncTask類不是靜態類,因此可以從該實現中訪問CustomActivity的屬性。

在方法2中,AsyncClass是分開實現的。如果您將活動授予此課程,則可以在執行後回撥所需的方法。對於我們的示例,此方法是#setChangedData方法。 CustomAsyncTask回調#onPostExecute中的#setChangedData。

public class CustomActivity extends AppCompatActivity { 

    String mChangedData; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Method 1 - change data into the anonymously implemented AsyncTask class 
     new AsyncTask<Integer, Void, Void>() { 

      @Override 
      protected Void doInBackground(Integer... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       super.onPostExecute(aVoid); 
       CustomActivity.this.mChangedData = "foo"; // this changes mChangedData as "foo" 
      } 
     }.execute(1); 

     // Method 2 - change data into the custom AsyncTask class 
     new CustomAsyncTask(this).execute(2); 
    } 

    public void setChangedData(String changedData){ 
     this.mChangedData = changedData; 
    } 

    static class CustomAsyncTask extends AsyncTask<Integer, Void, Void> { 
     CustomActivity mActivity; 
     public CustomAsyncTask(CustomActivity activity) { 
      this.mActivity = activity; 
     } 
     @Override 
     protected Void doInBackground(Integer... params) { 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      mActivity.setChangedData("bar"); 
     } 
    } 
} 

而且,作爲方法3,如果你想給你的活動和更多的AsyncTask鬆散分離,這是處理方法:

public class CustomActivity extends AppCompatActivity { 

    private String mChangedData; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     CustomAsyncTask task = new CustomAsyncTask(); 
     task.setOnDataChangedListener(new CustomAsyncTask.OnDataChangedListener() { 
      @Override 
      public void onDataChanged(String data) { 
       mChangedData = data; 
      } 
     }); 
     task.execute(1); 
    } 

    private static class CustomAsyncTask extends AsyncTask<Integer, Void, Void> { 

     private OnDataChangedListener onDataChangedListener; 
     @Override 
     protected Void doInBackground(Integer... params) { 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      if(onDataChangedListener != null) { 
       onDataChangedListener.onDataChanged("foo"); 
      } 
     } 

     void setOnDataChangedListener(OnDataChangedListener onDataChangedListener) { 
      this.onDataChangedListener = onDataChangedListener; 
     } 

     interface OnDataChangedListener { 
      void onDataChanged(String data); 
     } 
    } 
} 
相關問題