【问题标题】:Is different thread needed for this application?这个应用程序需要不同的线程吗?
【发布时间】:2023-03-30 19:34:01
【问题描述】:

我有一个应用程序,它定期通过 FTP 下载一个非常小的文本文件(10 个字节),然后上传一个更大的文件(200 个字节)。它使用警报管理器执行此操作,并且似乎运行良好。我想知道是否需要在不同的线程上运行它,以防互联网变得拥挤,还是我过于谨慎?这是FTP下载的代码:

 public void getFTP(Context context)
 {
  //
  // Download config.txt file from server
  //
   FTPClient ftpClient = new FTPClient();

 try{

 ftpClient.connect(InetAddress.getByName(ipAddress));  
 ftpClient.enterLocalPassiveMode();
 ftpClient.login("user", "pass");
 ftpClient.setFileType(FTP.ASCII_FILE_TYPE);

 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/sdcard/config.txt"),8*1024);

 boolean status=ftpClient.retrieveFile("config.txt", bos);

 if(status){
     Toast toast = Toast.makeText(context, "Downloaded config.txt!", Toast.LENGTH_SHORT);
     toast.show();
     }
     else {
     Toast toast = Toast.makeText(context, "Cannot download config.txt!", Toast.LENGTH_SHORT);
     toast.show();  
     return;
     }

 bos.flush();
 bos.close();

 ftpClient.logout();
 ftpClient.disconnect();

 }

 catch (IOException e){
     Toast.makeText(context,"Connection error!" , Toast.LENGTH_LONG).show();
 return;
 }

【问题讨论】:

  • 我会说这取决于你的应用程序在做什么。在超时的情况下,如果用户想做其他事情,可能会有点烦人。我想你可以只使用异步 http 客户端。

标签: android ftp android-asynctask alarmmanager


【解决方案1】:

如果问题是“我是否应该在非 UI 线程中进行网络连接,即使它们很小” - 答案是肯定的。

因为从ICS开始,比如Android会禁止UI线程的网络连接,如果你尝试就会抛出异常。

此外,将所有可能很长的任务分离到另一个线程是一个很好的做法。而“长”我认为大于 300 毫秒(例如,如果任何 Handler 的方法超过 300 毫秒,Android 将开始在日志中推送警告)。

注意:如果您将在 AlarmManager 回调中启动异步操作 - 准备好系统可能“睡眠”和休眠,即使您告诉 AlarmManager 唤醒事件。您可以在此处阅读有关此行为的信息:顶部标题第 2 段中的 http://developer.android.com/reference/android/app/AlarmManager.html

祝你好运

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2020-11-09
相关资源
最近更新 更多