Java Android:在下载数据时处理意外的互联网断开
我在这里有一个功能,从远程服务器下载数据到文件。我仍然对我的代码没有信心。我的问题是,如果在读取流并将数据保存到文件时,我突然断开了互联网连接,那么下面这些捕获异常是否真的能够捕获此类事件?如果没有,你能建议如何处理此类事件吗 注意:我在线程中调用这个函数,这样UI就不会被阻塞Java Android:在下载数据时处理意外的互联网断开,java,android,exception-handling,Java,Android,Exception Handling,我在这里有一个功能,从远程服务器下载数据到文件。我仍然对我的代码没有信心。我的问题是,如果在读取流并将数据保存到文件时,我突然断开了互联网连接,那么下面这些捕获异常是否真的能够捕获此类事件?如果没有,你能建议如何处理此类事件吗 注意:我在线程中调用这个函数,这样UI就不会被阻塞 public static boolean getFromRemote(String link, String fileName, Context context){ boolean dataRecei
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;
}
在开始网络通信之前,我使用以下代码片段检查网络是否可用(预防胜于治疗?)。一旦通信开始,我只能希望网络始终可用。否则,我将捕获抛出的异常并向用户显示一条消息
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();
}