2010-03-31 8 views
8

Mam tutaj funkcję, która pobiera dane ze zdalnego serwera do pliku. Nadal nie jestem pewien z moim kodem. Moje pytanie brzmi: co jeśli czytając strumień i zapisując dane do pliku i nagle zostałem odłączony w Internecie, czy te wyjątki poniżej złapią taki rodzaj incydentu? Jeśli nie, czy możesz zasugerować, jak poradzić sobie z tego rodzaju incydentem?Android: obsłużyć nieoczekiwany dostęp do Internetu podczas pobierania danych

Uwaga: tę funkcję nazywam w wątku, aby interfejs użytkownika nie był blokowany.

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; 

     } 

Odpowiedz

5

używam następujący fragment kodu, aby sprawdzić, czy sieć jest dostępna, zanim zacznę komunikację sieciową (zapobieganie lepsze niż leczyć?). Kiedy rozpocznie się komunikacja, mogę tylko mieć nadzieję, że sieć będzie dostępna przez cały czas. Jeśli nie, chciałbym wychwycić zgłoszony wyjątek i wyświetlić komunikat użytkownikowi.

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; 
} 

Możesz dołączyć DefaultThreadHandler z dowolnego wątku byłyby stosowane, jeżeli każdy wyjątek iść nieprzechwycony w kodzie wyjątków świadomości.

[EDIT: Dodawanie przykładowy kod]

//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

Czy możesz podać jakiś przykład, w jaki sposób stworzyć DefaultThreadHandler? Nie mam doświadczenia w tworzeniu tego. Dzięki. – capecrawler

+0

Nie użyłem ich samodzielnie w kodzie (znam je tylko w teorii), ale myślę, że ich używanie jest całkiem proste. Redagowałem powyższą odpowiedź; Spójrz. – Samuh

Powiązane problemy