2013-12-16 99 views
0

async-下載如何處理,如果從斷開用戶簡歷的Android安卓 Android系統的AsyncTask文件下載Java IO 我上一個異步下載工作處理重新連接在機器人

我簡單地使用I/O流下載

try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     // Starts the query 
     conn.connect(); 
     int response = conn.getResponseCode(); 
     Log.d(DEBUG_TAG, "The response is: " + response); 
     is = conn.getInputStream(); 

     // Convert the InputStream into a string 
     String contentAsString = readIt(is, len); 
     return contentAsString; 

    // Makes sure that the InputStream is closed after the app is 
    // finished using it. 
    } 

並試圖捕捉,如果有異常提醒消息。問題是,如果用戶連接網絡,我如何恢復下載?或者說,如果重新連接,只需自動執行下載任務?謝謝

+0

我相信你需要實現一個DownloadManager類,在這個類中你可以跟蹤當前的下載和狀態。您還需要一個BroadcastReceiver來了解用戶何時重新聯機。從廣播接收器中,您通知下載管理器恢復正在進行的下載。這可能不是適合你的解決方案,但這是我現在可以想到的。 –

+0

感謝您的建議。下載管理器很好用,但我需要製作一個下載隊列 – user1871516

回答

1

這有很多部分。首先,我建議使用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許可。