我在2.3.3上创建了一个Android项目并在移动2.3.3上尝试过,一切正常。它无法在移动设备4上运行,因此我为Android 4重新构建,但我遇到了同样的问题。
这是代码:
public void FTP_Download(){
String server = "192.168.1.135";
int port = 21;
String user = "pc1";
String pass = "1551";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
Toast.makeText(getBaseContext(), "download starting.",Toast.LENGTH_LONG).show();
// APPROACH #1: using retrieveFile(String, OutputStream)
String remoteFile1 = "i.xml";
File downloadFile1 = new File("sdcard/i.xml");
OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
outputStream1.close();
if (success) {
Toast.makeText(getBaseContext(), "File #1 has been downloaded successfully.",Toast.LENGTH_LONG).show();
}
} catch (IOException ex) {
System.out.println("Error: " + ex.getMessage());
ex.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
注意:
我使用commons-net-3.1进行连接。
答案 0 :(得分:2)
在上面的Android版本2.3中,您无法从主UI线程启动Internet连接。相反,您应该使用AsyncTask。我假设你没有使用AsyncTask。如果你是,那么也发布代码和日志猫。 ICS和HoneyComb不允许您在UI线程上执行的其他操作的一些示例是:(来自下面评论中发布的链接) -
答案 1 :(得分:1)
您不应该使用主UI线程来启动网络连接或从中读取/写入数据,如@phazorRise所述。但我强烈反对使用AsyncTask来执行下载。 AsyncTask专为短生活操作而设计,下载文件不属于该类别。
实现目标的最相关方式,如果您的文件很大(我认为它取决于用户,所以我们可以说它们很大)是使用服务来下载文件。
我邀请您查看RoboSpice,它会为您的应用提供强大的网络功能,它确实是Android上网络请求最有趣的库。
这是一个inforgraphics来熟悉替代方案并理解为什么使用服务比其他任何技术都要好。
答案 2 :(得分:1)
当我为andoid 4使用“internet conections”编程时,我按如下方式执行异步任务:
您可以将此类代码放入与主文件相同的文件中,以与全局变量或函数进行交互。
public class MyAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String url = urls[0]
try {
//Connection request code, in your case ftp
} catch (Exception e) {
//Catch code
}
}
@Override
protected void onPostExecute(String result) {
//Code to de After the connection is done
}
}
然后,在Activity中调用Asyn Task
String url = "http://...";
new MyAsyncTask().execute(url);
修改强> 这里解释了如何使用Async Task,并附带一个示例
http://developer.android.com/reference/android/os/AsyncTask.html
答案 3 :(得分:0)
我添加了此代码,一切正常
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
注意:我在另一篇文章中删除了@ user1169115评论中的代码。 这不是最好的解决方案,但我不知道为什么asynctask不起作用,所以我没有其他选择。