-1

我正在使用 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);
    }



}

但是它抛出了一个异常,不能强制转换为列表。

哪里有问题?

问候

4

3 回答 3

1

问题 :

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

你被投错了

解决方案 1:

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

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

笔记 :

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


解决方案 2:

用于onPostExecute(List<FTPFile> result)在 AsyncTask 执行完成时更新 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);
  }

}

并从 main 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("*****", "*****", "******");
    }

}
于 2012-12-15T10:35:27.997 回答
1

这会编译吗

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

???

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

改用这个

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                    "*****", "*****", "******").get();
于 2012-12-15T10:36:35.163 回答
0

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

代替,

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

和,

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

但是,这会阻塞你的 UI 线程。因此,最好是创建一个InterfaceBroadCastReceiver从 AsyncTask 返回值/数据。是相同的演示。

于 2012-12-15T10:36:41.763 回答