如何将ArrayList从AsyncTask返回到另一个类?

我想从服务器使用AsyncTask获取Ftp文件夹列表,并将文件夹名称ArrayList返回到主类并更新微调器适配器。

在主要类我有适配器旋转器

//the array i want to update in AsyncTask static ArrayList directoriesTeacher = new ArrayList(); //The adapter createfile_spinTeacher = (Spinner) findViewById(R.id.createfile_spinTeacher); final ArrayAdapter dataAdapterTeacher = new ArrayAdapter(this, android.R.layout.simple_spinner_item,directoriesTeacher); dataAdapterTeacher.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); createfile_spinTeacher.setAdapter(dataAdapterTeacher); 

在AsyncTask中:

  package com.nedoGarazas.learnanylanguage; import java.util.ArrayList; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import android.os.AsyncTask; import android.util.Log; public class FtpTeacher extends AsyncTask<ArrayList, Void, ArrayList> { private static final String TAG = "MyFTPClient"; public FTPClient mFTPClient = null; ArrayList ftpTeacher = new ArrayList(); @Override protected ArrayList doInBackground(ArrayList... params) { { try { mFTPClient = new FTPClient(); // connecting to the host mFTPClient.connect("host.ftp.com", 21); // now check the reply code, if positive mean connection success if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) { // login using username & password boolean status = mFTPClient.login("admin", "admin"); if(status == true){ try { FTPFile[] ftpFiles = mFTPClient.listFiles("/Wordsftp/"); int length = ftpFiles.length; for (int i = 0; i < length; i++) { String name = ftpFiles[i].getName(); boolean isDirectory = ftpFiles[i].isDirectory(); if (isDirectory) { //adding to arraylist ftpTeacher.add(name); Log.i(TAG, "Yra : " + name); } else { Log.i(TAG, "Directory : " + name); } } } catch(Exception e) { e.printStackTrace(); } mFTPClient.setFileType(FTP.ASCII_FILE_TYPE); mFTPClient.enterLocalPassiveMode(); } } } catch(Exception e) { Log.d(TAG, "Error: could not connect to host "); } return ftpTeacher; } } protected ArrayList[] onPostExecute(ArrayList... result) { ////How to return? } } 

那么我应该如何用主类中的ArrayList替换AsyncTask中的arraylist并更新spinner更新器?

您已经将ArrayList设为静态 ,也将其公之于众。 并按你的class级名称使用它。 并在onPostExecute()中填充您的ArrayList; 喜欢

  protected void onPostExecute(ArrayList... result) { if(YourClassName.directoriesTeacher.size()>0) { YourClassName.directoriesTeacher.clear(); } YourClassName.directoriesTeacher.addAll(result); } 

– PSEUDO代码 –

创建自定义interface如下:

 public interface IAsyncTask { void IAmFinished(ArrayList arrayList); } 

AsyncTask添加构造函数:

 private IAsyncTask asyncTaskListener; public MyAsyncTask(IAsyncTask asyncTaskListener){ this.asyncTaskListener = asyncTaskListener; } 

AsyncTaskPostExecute中:

 public void onPostExecute(List list) { asyncTaskListener.IAmFinished(list); } 

在启动AsyncTask Activity中:

 MyAsyncTask asyncTask = new MyAsyncTask(this); asyncTask.execute(..); 

实现界面:

 public class MyActivity implements IAsyncTask 

实施方法:

 public void IAmFinished(ArrayList list){ // Do whatever you want with your returned object } 

我假设您在获取数据时不需要微调器,而是使用后台任务中的数据填充您的微调器? 从AsyncTask返回数据通常依赖于这种模式,使用接口。

1)创建一个接口,以便您可以回发结果:(这个类可以在单独的文件中创建,也可以在任一类中声明它)

 public interface ReturnData{ void handleReturnData(ArrayList list); } 

2)在主类中实现ReturnData接口:

 public class MyMainClass extends Activity implements ReturnData{ AsyncTask ftpTeacher = new FtpTeacher();//declare your async task @Override public void onCreate(Bundle savedInstanceState) { ftpTeacher.returnData = this; //set this class as receiver for return data //set up adapters etc, just like you do now ... } //Your new data will be returned here - update your current adapter with new list @Override void handleReturnData(ArrayList list){ directoriesTeacher = list; //assign new data dataAdapterTeacher.notifyDataSetChanged(); //Tell adapter it has new data = forces redraw } .... } 

3)在AsyncTask类中:

 public class FtpTeacher extends AsyncTask, Void, ArrayList> { private static final String TAG = "MyFTPClient"; public FTPClient mFTPClient = null; ArrayList ftpTeacher = new ArrayList(); public ReturnData returnData; // <--- PUBLIC ... } 

4)最后,返回数据:

 protected ArrayList[] onPostExecute(ArrayList... result) { returnData.handleReturnData(result); } 

在您的main中,您调用AsyncTask,覆盖onPostExecute方法并将适配器内容放在那里。 它在UI线程上被调用,所以它是保存的。

所以在你调用AsyncTask的地方,做

 new FTPTeacher() { public void onPostExecute(List list) { createfile_spinTeacher = (Spinner) findViewById(R.id.createfile_spinTeacher); final ArrayAdapter dataAdapterTeacher = new ArrayAdapter(this, android.R.layout.simple_spinner_item,list); dataAdapterTeacher.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); createfile_spinTeacher.setAdapter(dataAdapterTeacher); } }.execute(); 

onPostExecute方法在UI线程中运行。 您可以将postexecute()中的结果分配给main方法中的arraylist。 通过调用notifydatasetChanged更新适配器以更新列表视图。

实现一个传递ArrayListlistener ,并使用此侦听器返回ArrayList

 public interface TaskListener { public void onSuccess(ArrayList result); } 

在调用操作执行的异步任务时,创建TaskListener的实例,如下所示:

 TaskListener listener = new TaskListener() { @Override public void onSuccess(ArrayList result) { // Your result will come here } }; 

将此listener对象作为参数传递给异步任务构造函数。 并在异步任务本身中创建TaskListener的全局实例。 将构造函数中的TaskListener参数分配给全局实例。

然后在异步任务类的onPostExecute中:

 protected ArrayList[] onPostExecute(ArrayList... result) { this.taskListenerGlobalInstance(result); // this will invoke the call back method } 

在AsyncTask中,您可以拥有一个与您的活动相同的成员(MyActivity m_activity)。

在AsyncTask构造函数中,设置MyActivity参数并将其记录在m_activity中。

在你的onPostExecute中运行一个刷新你的微调器适配器的活动方法: m_activity.updateSpinner(ftpTeacher );

在Asynctask类中创建一个接口

 public interface OnDownload { public void onDownloadComplete(ArrayList list); } 

并在该类的构造函数中获取该接口,如下所示

 private OnDownload mOnDownload; public FtpTeacher(OnDownload onDownload) { this.mOnDownload = onDownload; } 

并在onPostExecute中通过接口发送结果,如下所示

 mOnDownload.onDownloadComplete(listResult); 

现在在主类中实现接口,您将获得更新列表,如下所示

 public class MainActivity extends Activity implements OnDownload { public void sampleCall() { new FtpTeacher(this).execute(); } @Override public void onDownloadComplete(ArrayList list) { //Here you can update the spinner } }