我正在使用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);
}
}
但它抛出的异常无法转换为列表。
问题出在哪里?
此致
答案 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)