0

我在 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 进行连接。

4

4 回答 4

2

在 android 2.3 以上版本中,您无法从主 UI 线程启动 Internet 连接。相反,您应该使用AsyncTask。我假设您没有使用 AsyncTask。如果是,请发布代码并记录 cat 。ICS 和 HoneyComb 不允许您在 UI 线程上执行的其他操作的一些示例是:(来自下面评论中发布的链接)-

  • 打开一个 Socket 连接(即 new Socket())。
  • HTTP 请求(即 HTTPClient 和 HTTPUrlConnection)。
  • 尝试连接到远程 MySQL 数据库。
  • 下载文件(即 Downloader.downloadFile())。
于 2012-11-17T09:49:09.723 回答
1

当我为 andoid 4 使用“互联网连接”编程时,我执行如下异步任务:

您可以将此类代码与主体文件放在同一个文件中,以与全局变量或函数交互。

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);

编辑 这里解释了如何使用异步任务,并举例

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-11-17T10:26:33.267 回答
1

正如@phazorRise 解释的那样,您不应该使用主 UI 线程来启动网络连接或从中读取/写入数据。但我强烈反对使用 AsyncTask 来执行下载。AsyncTask 专为短期操作而设计,下载文件不属于该类别。

如果您的文件很大(我认为这取决于用户,所以我们可以说它们很大),实现目标的最相关方法是使用服务来下载文件。

我邀请您看一下RoboSpice,它将为您的应用程序提供网络健壮性,它确实是 Android 上最有趣的网络请求库。

这是一个信息图表,可让您熟悉替代方案并了解为什么使用服务比任何其他技术都要好。

于 2012-11-17T09:56:45.567 回答
0

我添加了这段代码,一切正常

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

注意:我从另一篇文章中的@user1169115 评论中获取了代码。这不是最好的解决方案,但我不知道为什么 asynctask 不起作用,所以我别无选择。

于 2012-11-18T07:42:52.280 回答