0

我正在尝试使用 AlarmManager 在广播接收器中进行自动 FTP 传输,它在我的 HTC 上运行良好,但在我朋友的 Galaxy S3 上崩溃了。这似乎是一个 ICS 问题,因为当我模拟它时,LogCat 中有一个“主线程上的网络”异常。

看来我将不得不使用 AsyncTask。是否可以在广播接收器中实现 AsyncTask?我在网上找不到任何关于它的信息。有人知道吗?

以下是 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;
 }

它是使用 onReceive() 方法调用的

getFTP(context);
4

1 回答 1

0

我已经从广播接收器调用了对 AsyncTask 实现的执行,没有问题。只要从应用程序的主线程调用 task.execute() 就应该没问题(这在接收器中是正常情况)。

但是,如果您确实有问题,您也可以尝试将您的 ftp 会话包装在 Runnable 中,然后执行以下操作:

new Thread(new FtpRunnable()).start();

FWIW,这里有更多关于NetworkOnMainThreadException的信息。因此,这种行为本身不是问题,而是设计使然。

于 2012-09-04T22:22:05.693 回答