在我的Android应用程序中,我有一个从我的服务器下载照片的AsyncTask。如果我得到一个异常(主要用于连接超时),我会向用户显示一条消息。我的问题是我的代码工作时间 MOST ,(这意味着有时我打断WiFi连接,我的logcat中显示异常但是消息不会出现所以我结束了它认为可能存在我无法处理的异常)我无法弄清楚具体原因。我将发布在我的AsyncTask中运行的代码和执行基本工作的函数。希望你能发现一些她错过的东西
@Override
protected String doInBackground(String... args) {
JSONParser jParser = new JSONParser();
JSONObject jsonObj = jParser.getJSONFromUrl(url);
Log.d("check1",url);
try {
list.addAll(processJsonData(jsonObj));
} catch (JSONException e) {
e.printStackTrace();
onDownloadFailed(this);
return "failed";
} catch (SocketException e) {
Log.e("Exception", e.getLocalizedMessage());
onDownloadFailed(this);
return "failed";
} catch (IOException e) {
Log.e("Exception", e.getLocalizedMessage());
onDownloadFailed(this);
return "failed";
}finally {
jsonObj=null;
}
return "done";
}
进程JsonData实际上更大,是下载照片的部分,另一部分是关于将字符串映射到大型Json文件
private ArrayList<Monument> processJsonData(JSONObject jsonObj) throws IOException, SocketException, JSONException{
if(attachments!=null){
int lengthSize;
if(attachments.length()<3)
lengthSize=attachments.length();
else
lengthSize=3;
for(int j=0;j<lengthSize;++j){
JSONObject atta = attachments.getJSONObject(j);
JSONObject images = atta.optJSONObject(TAG_IMAGES);
if(images!=null){
JSONObject medium = images.getJSONObject(TAG_MEDIUM);
String url_image = medium.getString(TAG_URL_IMAGE);
String id = atta.getString("id");
String filename =title.replace(" ","")+id+".nomedia";
File destination = new File(MyApplication.getPhotoStorage() ,filename);
URL url = new URL (url_image);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destination);
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
localPhotosUrl.add(destination.getAbsolutePath());
}
}
}
答案 0 :(得分:1)
也许你可以命名被抛出的实际异常?
它可能是RuntimeException
,因此未经检查。
有关已检查/未检查的例外的详细信息,请参阅:Oracle Docs - Exceptions
答案 1 :(得分:0)
InteruptedException
的API说明如下;
当线程正在等待,休眠或以其他方式占用时抛出,并且 线程在活动之前或期间被中断。 有时,方法可能希望测试当前线程是否具有 被打断了,如果是的话,立即抛出这个例外。
如问题评论中所述,只有在检查完成后才取消AsyncTask
可以防止此问题。
或者(但我建议反对),您可以在取消InteruptedException
的方法中捕获AsyncTask
以定义您的自定义捕获行为。在重新考虑代码的逻辑流程之后,使用catch
解决程序逻辑缺陷应该只是最后的手段。