Android: обрабатывать неожиданное отключение Интернета во время загрузки данных - PullRequest
8 голосов
/ 31 марта 2010

У меня здесь есть функция, которая загружает данные с удаленного сервера в файл. Я все еще не уверен в своем коде. У меня такой вопрос: что если при чтении потока и сохранении данных в файл, и вдруг я был отключен от Интернета, могут ли эти исключения перехвата, приведенные ниже, действительно уловить такой инцидент? Если нет, то можете ли вы предложить, как справиться с такого рода инцидентами?

Примечание. Я вызываю эту функцию в потоке, чтобы пользовательский интерфейс не блокировался.

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;

        }

1 Ответ

5 голосов
/ 31 марта 2010

Я использую следующий фрагмент, чтобы проверить, доступна ли сеть, прежде чем я начну сетевое взаимодействие (профилактика лучше лечения?). Как только связь начнется, я могу только надеяться, что сеть останется доступной повсюду. Если нет, я бы поймал выброшенное исключение и отобразил бы сообщение пользователю.

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

Вы можете прикрепить DefaultThreadHandler к любому потоку, который будет использоваться, если какое-либо исключение останется необработанным в коде вызова исключения.

[РЕДАКТИРОВАТЬ: Добавление образца кода]

//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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...