2010-03-31 9 views
8

Ich habe hier eine Funktion, die Daten von einem Remote-Server in Datei herunterlädt. Ich bin immer noch nicht sicher mit meinem Code. Meine Frage ist, was wäre, wenn während des Lesens des Streams und Speichern der Daten in eine Datei und plötzlich wurde ich im Internet getrennt, können diese Ausnahmen unten Fang solche Art von Vorfall wirklich fangen? Wenn nicht, können Sie vorschlagen, wie man mit dieser Art von Vorfall umgeht?Android: Umgang mit unerwarteten Internet-Verbindung beim Herunterladen von Daten

Hinweis: Ich rufe diese Funktion in einem Thread, so dass die Benutzeroberfläche nicht blockiert wird.

public static boolean getFromRemote(String link, String fileName, Context context){ 
     boolean dataReceived = false; 
     ConnectivityManager connec = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 

      if (connec.getNetworkInfo(0).isConnected() || connec.getNetworkInfo(1).isConnected()){ 
       try { 
         HttpClient httpClient = new DefaultHttpClient(); 
         HttpGet httpGet = new HttpGet(link); 
         HttpParams params = httpClient.getParams(); 
         HttpConnectionParams.setConnectionTimeout(params, 30000); 
         HttpConnectionParams.setSoTimeout(params, 30000); 
         HttpResponse response; 
         response = httpClient.execute(httpGet); 
         int statusCode = response.getStatusLine().getStatusCode(); 
         if (statusCode == 200){ 
          HttpEntity entity = response.getEntity(); 



          InputStream in = null; 
          OutputStream output = null; 

          try{ 
           in = entity.getContent(); 

           String secondLevelCacheDir = context.getCacheDir() + fileName; 

           File imageFile = new File(secondLevelCacheDir); 

           output= new FileOutputStream(imageFile); 
           IOUtilities.copy(in, output); 
           output.flush(); 
          } catch (IOException e) { 
           Log.e("SAVING", "Could not load xml", e); 
          } finally { 
           IOUtilities.closeStream(in); 
           IOUtilities.closeStream(output); 
           dataReceived = true; 

          } 
         } 
        }catch (SocketTimeoutException e){ 
         //Handle not connecting to client !!!! 
         Log.d("SocketTimeoutException Thrown", e.toString()); 
         dataReceived = false; 

        } catch (ClientProtocolException e) { 
         //Handle not connecting to client !!!! 
         Log.d("ClientProtocolException Thrown", e.toString()); 
         dataReceived = false; 

        }catch (MalformedURLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         dataReceived = false; 
         Log.d("MalformedURLException Thrown", e.toString()); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         dataReceived = false; 
         Log.d("IOException Thrown", e.toString()); 
        } 
       } 
      return dataReceived; 

     } 

Antwort

5

Ich verwende den folgenden Code-Schnipsel zu überprüfen, ob Netzwerk verfügbar ist, bevor ich eine Netzwerk-Kommunikation zu starten (Vorbeugen ist besser als heilen?). Sobald die Kommunikation startet, kann ich nur hoffen, dass das Netzwerk durchgängig verfügbar bleibt. Wenn nicht, würde ich Exception ausgelöst bekommen und dem Benutzer eine Nachricht anzeigen.

public boolean isNetworkAvailable() { 
    Context context = getApplicationContext(); 
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity == null) { 
     boitealerte(this.getString(R.string.alert),"getSystemService rend null"); 
    } else { 
     NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
     if (info != null) { 
     for (int i = 0; i < info.length; i++) { 
      if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
       return true; 
      } 
     } 
     } 
    } 
    return false; 
} 

Sie können eine DefaultThreadHandler mit jedem Thread anhängen, die verwendet werden würde, wenn eine Ausnahme in der Ausnahme-raising Code abgefangene gehen.

[EDIT: Hinzufügen von Beispielcode]

//attaching a Handler with a thread using the static function 
Thread.setDefaultUncaughtExceptionHandler(handler); 

//creating a Handler 
private Thread.UncaughtExceptionHandler handler= 
     new Thread.UncaughtExceptionHandler() { 
     public void uncaughtException(Thread thread, Throwable ex) { 
      Log.e(TAG, "Uncaught exception", ex); 
      showDialog(ex); 
     } 
    }; 

void showDialog(Throwable t) { 
     AlertDialog.Builder builder=new AlertDialog.Builder(mContext); 
      builder 
       .setTitle("Exception") 
       .setMessage(t.toString()) 
       .setPositiveButton("Okay", null) 
       .show(); 
    } 
+0

Können Sie einige Beispiele geben, wie ein DefaultThreadHandler zu schaffen? Ich habe keine Erfahrung damit. Vielen Dank. – capecrawler

+0

Ich habe sie nicht selbst im Code verwendet (kenne sie nur in der Theorie), aber ich denke, sie zu verwenden ist ziemlich geradlinig. Ich habe meine Antwort oben bearbeitet; Schau mal. – Samuh

Verwandte Themen