Android:下载数据时处理意外的互联网断开连接

我在这里有一个将数据从远程服务器下载到文件的function。 我仍然对我的代码没有信心。 我的问题是,如果在读取数据stream并将数据保存到文件中,突然间我在互联网上断开连接,那么下面的例外情况能否真的发现这种事件呢? 如果没有,你能build议如何处理这类事件吗?

注意:我在一个线程中调用这个函数,这样UI就不会被阻塞了。

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

Solutions Collecting From Web of "Android:下载数据时处理意外的互联网断开连接"

在开始networking通信之前,我使用下面的代码片断来检查networking是否可用(预防好于治疗?)。 一旦通信开始,我只能希望networking始终可用。 如果没有,我会赶上exception抛出并显示一条消息给用户。

 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的任何线程,如果在exception提升代码中没有捕获到任何exception,这个线程将被使用。

[编辑:添加示例代码]

 //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(); }