Android应用无法在Android 4上运行

时间:2012-11-17 09:45:57

标签: android ftp android-4.0-ice-cream-sandwich ftp-client

我在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 个答案:

答案 0 :(得分:2)

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

  • 打开套接字连接(即新的套接字())。
  • HTTP请求(即HTTPClient和HTTPUrlConnection)。
  • 正在尝试连接到远程MySQL数据库。
  • 下载文件(即Downloader.downloadFile())。

答案 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不起作用,所以我没有其他选择。