在android中接收Arraylist的参数

时间:2012-12-15 10:30:16

标签: java android eclipse

我正在使用apache lib编写一个小型ftp客户端。我正在返回ArrayList中的文件列表

import java.io.IOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

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 myftpTask extends AsyncTask<String, Void, List<FTPFile>> {
    public FTPFile[] FTPFile;
    FTPClient mFtp = new FTPClient();

    @Override
    protected List<FTPFile> doInBackground(String... params) {
        List<FTPFile> myFiles = new ArrayList<FTPFile>();
        // TODO Auto-generated method stub
        try {
            mFtp.connect(params[0], 21);

            if (FTPReply.isPositiveCompletion(mFtp.getReplyCode())) {
                mFtp.login(params[1], params[2]);
                mFtp.enterLocalPassiveMode();
                mFtp.changeWorkingDirectory("/public_html");
                FTPFile files[] = mFtp.listFiles();



                for (int i = 0; i < files.length; i++) { // does not enter here
                    //Log.d("F-> " , ((FTPFile) files[i]).getName().toString());
                    //myFiles.add((FTPFile) files[i]).getName().toString());
                    myFiles.add(files[i]);
                }
                Log.v("Files", myFiles.toString());
                mFtp.disconnect();
            }
        } catch (SocketException e) {
            try {
                mFtp.disconnect();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //return 1;
        return myFiles;

    }
}

我正在收到它

import java.util.List;

import org.apache.commons.net.ftp.FTPFile;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.listView1);

        List<FTPFile> listofFiles;

        listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

        ArrayAdapter<FTPFile> arrayAdapter = new ArrayAdapter<FTPFile>(this,
                android.R.layout.simple_list_item_1, listofFiles);
        lv.setAdapter(arrayAdapter);
    }



}

但它抛出的异常无法转换为列表。

问题出在哪里?

此致

3 个答案:

答案 0 :(得分:1)

问题:

listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

你犯了错误的方式

解决方案1:

使用get ()方法从主UI线程中的AsyncTask获取结果:

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                    "*****", "*****", "******").get();

注意:

这个解决方案暂停你的主线程执行,直到响应没有从AsyncTask返回,如文档所述

<小时/> 解决方案2:

在AsyncTask执行完成时使用onPostExecute(List<FTPFile> result)更新Ui而不挂起Ui

只需将您的代码更改为:

public class myftpTask extends AsyncTask<String, Void, List<FTPFile>> {

   //your code here

  @Override
  protected void onPostExecute(List<FTPFile> result) {
   // TODO Auto-generated method stub
   super.onPostExecute(result);
   ArrayAdapter<FTPFile> arrayAdapter = new ArrayAdapter<FTPFile>(this,
                android.R.layout.simple_list_item_1, result);
        lv.setAdapter(arrayAdapter);
  }

}

从主Activity开始执行myftpTask任务:

public class MainActivity extends Activity {
 ListView lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.listView1);

        new myftpTask().execute("*****", "*****", "******");
    }

}

答案 1 :(得分:1)

编译

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

???

newmyftpTask().execute();从此类型AsyncTask<String, Void, List<FTPFile>>

返回对象

使用此代替

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                    "*****", "*****", "******").get();

答案 2 :(得分:0)

要从AsyncTask获取返回值,您必须使用其get()方法

替换,

listofFiles = (List<FTPFile>) new myftpTask().
                                         execute("*****", "*****", "******");

使用,

listofFiles = (List<FTPFile>) new myftpTask().
                                    execute("*****", "*****", "******").get();

但是,这会阻止你的UI线程。因此,最好是创建InterfaceBroadCastReceiver以从AsyncTask返回值/数据。 Here是同样的演示。