2017-08-03 64 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); 
     } 
    } 
} 
相关问题