這有很多部分。首先,我建議使用droidQuery來處理您的網絡任務。它是高度可配置的,已經可以處理錯誤,超時問題等。爲了讓您一開始,嘗試這樣的事:
Integer[] statusCodes = new Integer[]{480,522};//request and connection timeout error codes
$.ajax(new AjaxOptions().url(myURL).timeout(1000).dataType("text").statusCode(statusCodes, new Function() {
@Override
public void invoke($ d, Object... args) {
//queue task to run again.
int statusCode = (Integer) args[0];
Log.e("Ajax", "Timeout (Error code " + statusCode + ").");
requeue((AjaxOptions) args[1]);
}
}).success(new Function() {
@Override
public void invoke($ d, Object... args) {
//since dataType is text, the response is a String
String response = (String) args[0];
Log.i("Ajax", "Response String: " + response);
}
}).error(new Function() {
@Override
public void invoke($ d, Object... args) {
//show error message
AjaxError error = (AjaxError) args[0];
Log.e("Ajax", "Error " + error.status + ": " + error.reason);
}
}));
你requeue
方法檢查網絡狀態。如果網絡啓動,請求再次嘗試。如果不可用,當網絡可用時,它將排隊等待運行。此隊列將用於:
public static List<AjaxOptions> queue = new ArrayList<AjaxOptions>();
所以這種方法看起來是這樣的:
private void requeue(AjaxOptions options)
{
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null)
cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (info == null)
cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (info != null && info.isConnectedOrConnecting())
$.ajax(options);
else {
synchronized(queue) {
queue.add(options);
}
}
}
最後,爲了確保排隊的請求被稱爲當網絡可用時,你需要使用一個BroadcastReceiver來聆聽網絡中的變化。這方面的一個很好的例子是NetWatcher,但你的onReceive
方法看上去就像這樣:
@Override
public void onReceive(Context context, Intent intent) {
//here, check that the network connection is available. If yes, start your service. If not, stop your service.
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
if (info.isConnected()) {
synchronized(myActivity.queue) {
for (AjaxOptions options : myActivity.queue) {
$.ajax(options);
}
myActivity.queue.clear();
}
}
}
}
如果你想queue
變量是private
,你可以註冊代碼廣播接收器(而不是在清單) ,並使其成爲您的活動的內部課程。最後,爲確保您的BroadcastReceiver
按預期工作,你需要以下權限:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
還要保證網絡可用時,不要忘了INTERNET
許可。
我相信你需要實現一個DownloadManager類,在這個類中你可以跟蹤當前的下載和狀態。您還需要一個BroadcastReceiver來了解用戶何時重新聯機。從廣播接收器中,您通知下載管理器恢復正在進行的下載。這可能不是適合你的解決方案,但這是我現在可以想到的。 –
感謝您的建議。下載管理器很好用,但我需要製作一個下載隊列 – user1871516