2011-10-19 2 views
1

私はネットから非常に少量のデータをダウンロードする小さな小さなアプリケーションを持っています。それ以外はうまく動作し、正しくダウンロードされますが、接続が変更されると(Wi-Fi範囲を失う)、ダウンロードは完了せず、ユーザーはデータを取得しません。IntentServiceでデータを読み込んでいるときの接続の変更を処理する

私はこれをどう対処するか考えています。私は自分のIntentServiceと通信する私の主なアクティビティにBroadcastReceiverを設定しました。 IntentServiceがダウンロードを完了すると、受信者の登録を解除します。このすべてをトップにするために、私はブロードキャスト受信者を設定して接続の変更を監視し、接続が利用可能かどうかを確認し、接続がある場合、メインアクティビティはインテントを送信してダウンロードを開始します。ここを参照してください:

主な活動を:

public class Sample extends Activity { 
    private BroadcastReceiver connectivityReceiver; 
    private ResponseReceiver receiver; 

    protected void onCreate(Bundle sis){ 
     super.onCreate(sis); 


    IntentFilter intentFilter = new IntentFilter(
      "android.net.conn.CONNECTIVITY_CHANGE"); 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      if (Network.isOnline()) { 
       fireUpDownloadingIntent(); 
      } 
     } 
     }, intentFilter); 


    } 

    public class ResponseReceiver extends BroadcastReceiver { 
     public static final String ACTION_RESP = "com.irough.intent.action.URL_LOADED"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
       if(intent.getBooleanExtra(DLService.DOWNLOAD_COMPLETE, false) { 
        unRegisterReceiver(connectivityReceiver); 
       } 
     } 

    } 
} 

DLService.java:

public class DLService extends IntentService { 
    public static final String DOWNLOAD_COMPLETE = "dlc"; 

    public DLService() { 
     super("DLService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(ResponseReceiver.ACTION_RESP); 

    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); 
     broadcastIntent.putExtra(DOWNLOAD_COMPLETE, true); 
     sendBroadcast(broadcastIntent); 

    } 

} 

コードを約うまく動作するはずですが、それを行うにはより簡単か良い方法はありますか?サービスで行う必要はありません。接続が落ちたときにAsynctaskが私を閉じてしまい、ダウンロードアクションをサービスに入れなければなりません。

答えて

1

あなたのダウンロードで接続が失われた場合、ダウンロードが何らかの例外をスローすると思います。私がいた場合は、ユーザーに(android notification apiを使用して)通知するだけで、データを再ダウンロードしようとするオプションを与えることができます。

好ましくは(同様の質問の私の以前の投稿に反して)、あなたはアンドロイドの新しいお気に入りのクラス「AsyncTaskLoader」を使うことができます。それはあなたがここでやりたいことのための請求書にちょうど合うように聞こえる。バスク語で、ダウンロードにエラーがある場合は、ローダーにnullを返すようにしてください。その後、あなたの活動のあなたのonLoaderFinishedフックで、ユーザーに知らせるために何をする必要があるかを実行します。このクラスはAPIレベル3以上でのみ使用できますが、より低いAPIレベルではandroid compatibility packageを通じてアクセスできます。

+0

はい、私はそれを簡単に行うことができます。しかし、私のアプリは "最も革新的な電話番号を提供する"アプリだと考えられているので、ユーザーに少なくとも "これをやり直すことはできませんでした"というメッセージをできるだけ表示させたいと思っています。 –

+0

あなたのコメントを解決するために私の投稿を編集しました –

関連する問題