如何将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
在AsyncTask
添加构造函数:
private IAsyncTask asyncTaskListener; public MyAsyncTask(IAsyncTask asyncTaskListener){ this.asyncTaskListener = asyncTaskListener; }
在AsyncTask
的PostExecute
中:
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
我假设您在获取数据时不需要微调器,而是使用后台任务中的数据填充您的微调器? 从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更新适配器以更新列表视图。
实现一个传递ArrayList
的listener
,并使用此侦听器返回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 } }