所以我有一个小应用程序可以从网上下载非常少量的数据。其他一切工作正常并正确下载,但是当连接发生变化时(我失去了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会关闭我,这就是将下载操作放到服务中的原因。
答案 0 :(得分:1)
如果您在下载中丢失了连接,我想您的下载会引发某种异常。如果是的话,我只需通知用户(使用android notification api),并为他们提供尝试重新下载数据的选项。
尽管如此,(与我之前在类似问题中的帖子相反),你可以在android中使用我最喜欢的类AsyncTaskLoader。听起来它完全适合您想要在这里做的事情。基本上,如果下载出错,只需让你的加载器返回null。然后在您的活动的onLoaderFinished挂钩中,执行有关通知用户的任何操作。请注意,此类仅适用于API级别3及更高级别,但仍可通过android compatibility package以较低的API级别访问。