0

AlarmManager を使用してブロードキャスト レシーバーで自動 FTP 転送を実行しようとしています。私の HTC ではうまく機能していますが、友人の Galaxy S3 ではクラッシュしています。シミュレートするとLogCatに「メインスレッドのネットワーク」例外があるため、ICSの問題のようです。

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 実装で execute を呼び出しました。task.execute() がアプリのメイン スレッドから呼び出される限り、問題はありません (レシーバーでは通常のケースです)。

しかし、問題がある場合は、ftp セッションを Runnable でラップしてから、次のようにすることもできます。

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

FWIW、ここにNetworkOnMainThreadExceptionに関する詳細情報があります。その動作自体は問題ではなく、仕様によるものです。

于 2012-09-04T22:22:05.693 に答える