使用IntentService加载数据时处理连接更改

时间:2011-10-19 20:21:24

标签: android

所以我有一个小应用程序可以从网上下载非常少量的数据。其他一切工作正常并正确下载,但是当连接发生变化时(我失去了wifi范围),下载将无法完成,用户也无法获取数据。

我知道如何处理这个问题。我在我的主Activity上设置了一个BroadcastReceiver,它与我的IntentService进行通信。当IntentService完成下载后,我取消注册接收器。最重要的是,我设置了一个Broadcastreceiver来监听连接变化,如果连接可用,如果有连接,主活动会发送一个Intent来开始下载。见这里:

主要活动:

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 force会关闭我,这就是将下载操作放到服务中的原因。

1 个答案:

答案 0 :(得分:1)

如果您在下载中丢失了连接,我想您的下载会引发某种异常。如果是的话,我只需通知用户(使用android notification api),并为他们提供尝试重新下载数据的选项。

尽管如此,(与我之前在类似问题中的帖子相反),你可以在android中使用我最喜欢的类AsyncTaskLoader。听起来它完全适合您想要在这里做的事情。基本上,如果下载出错,只需让你的加载器返回null。然后在您的活动的onLoaderFinished挂钩中,执行有关通知用户的任何操作。请注意,此类仅适用于API级别3及更高级别,但仍可通过android compatibility package以较低的API级别访问。