Android 如果在获取JSON数据时没有internet连接或URL格式错误,则强制关闭
哎,, 我是android新手,有点小问题。我正在运行一个异步任务,在后台从web获取json数据。这很好,但是当没有internet连接或json解析错误或URL格式不正确时,应用程序强制关闭。有没有办法显示自定义错误而不是强制关闭应用程序?当然,要让应用程序保持打开状态。以下是我的简化代码:Android 如果在获取JSON数据时没有internet连接或URL格式错误,则强制关闭,android,json,exception-handling,Android,Json,Exception Handling,哎,, 我是android新手,有点小问题。我正在运行一个异步任务,在后台从web获取json数据。这很好,但是当没有internet连接或json解析错误或URL格式不正确时,应用程序强制关闭。有没有办法显示自定义错误而不是强制关闭应用程序?当然,要让应用程序保持打开状态。以下是我的简化代码: public class Main extends Activity { public static final int ACTIVITY_CREATE = 0; protected
public class Main extends Activity {
public static final int ACTIVITY_CREATE = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new LongOperation(Main.this).execute();
}
class LongOperation extends AsyncTask<String, Void, String> {
private Main longOperationContext = null;
private static final int ACTIVITY_CREATE = 0;
public LongOperation(Main context) {
longOperationContext = context;
}
@Override
protected String doInBackground(String... params) {
try {
//JSON Fetching and parsing here
} catch (MalformedURLException e) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(Main.this);
alertbox.setTitle("Error");
alertbox.setMessage("URL Exception");
alertbox.setNegativeButton("OK", null);
alertbox.show();
} catch (IOException e) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(Main.this);
alertbox.setTitle("Error");
alertbox.setMessage("IO Exception");
alertbox.setNegativeButton("OK", null);
alertbox.show();
} catch (JSONException e) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(Main.this);
alertbox.setTitle("Error");
alertbox.setMessage("JSON Exception");
alertbox.setNegativeButton("OK", null);
alertbox.show();
}
return null;
}
@Override
protected void onPostExecute(String result) {
//...
}
protected void onPreExecute() {
//...
}
@Override
protected void onProgressUpdate(Void... values) {
//...
}
}
}
public类主扩展活动{
公共静态最终整数活动_CREATE=0;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
新的长操作(Main.this.execute();
}
类LongOperation扩展了异步任务{
私有主longOperationContext=null;
私有静态最终整数活动_CREATE=0;
公共业务(主上下文){
longOperationContext=上下文;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
//JSON获取和解析在这里
}捕获(格式错误){
AlertDialog.Builder alertbox=新建AlertDialog.Builder(Main.this);
alertbox.setTitle(“错误”);
setMessage(“URL异常”);
alertbox.setNegativeButton(“确定”,空);
show();
}捕获(IOE异常){
AlertDialog.Builder alertbox=新建AlertDialog.Builder(Main.this);
alertbox.setTitle(“错误”);
设置消息(“IO异常”);
alertbox.setNegativeButton(“确定”,空);
show();
}捕获(JSONException e){
AlertDialog.Builder alertbox=新建AlertDialog.Builder(Main.this);
alertbox.setTitle(“错误”);
setMessage(“JSON异常”);
alertbox.setNegativeButton(“确定”,空);
show();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//...
}
受保护的void onPreExecute(){
//...
}
@凌驾
受保护的void onProgressUpdate(void…值){
//...
}
}
}
提前谢谢
编辑:
以下是日志:
02-22 19:33:47.881: WARN/dalvikvm(683): threadid=11: thread exiting with uncaught exception (group=0x40015560)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): FATAL EXCEPTION: AsyncTask #3
02-22 19:33:47.881: ERROR/AndroidRuntime(683): java.lang.RuntimeException: An error occured while executing doInBackground()
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.lang.Thread.run(Thread.java:1019)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.os.Handler.<init>(Handler.java:121)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.app.Dialog.<init>(Dialog.java:101)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.app.AlertDialog.<init>(AlertDialog.java:63)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.app.AlertDialog.<init>(AlertDialog.java:59)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.app.AlertDialog$Builder.create(AlertDialog.java:786)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.app.AlertDialog$Builder.show(AlertDialog.java:801)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at en.android.albumdownloader.Main$LongOperation.doInBackground(Main.java:130)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at en.android.albumdownloader.Main$LongOperation.doInBackground(Main.java:1)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
02-22 19:33:47.881: ERROR/AndroidRuntime(683): ... 4 more
02-22 19:33:47.881: WARN/ActivityManager(71): Force finishing activity en.android.albumdownloader/.Main
02-22 19:33:51.822: ERROR/WindowManager(683): Activity en.android.albumdownloader.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4057bdf0 that was originally added here
02-22 19:33:51.822: ERROR/WindowManager(683): android.view.WindowLeaked: Activity en.android.albumdownloader.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4057bdf0 that was originally added here
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.ViewRoot.<init>(ViewRoot.java:258)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.Window$LocalWindowManager.addView(Window.java:424)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.app.Dialog.show(Dialog.java:241)
02-22 19:33:51.822: ERROR/WindowManager(683): at en.android.albumdownloader.Main$LongOperation.onPreExecute(Main.java:174)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.os.AsyncTask.execute(AsyncTask.java:391)
02-22 19:33:51.822: ERROR/WindowManager(683): at en.android.albumdownloader.Main$1.onClick(Main.java:56)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.View.performClick(View.java:2485)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.view.View$PerformClick.run(View.java:9080)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.os.Handler.handleCallback(Handler.java:587)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.os.Looper.loop(Looper.java:123)
02-22 19:33:51.822: ERROR/WindowManager(683): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-22 19:33:51.822: ERROR/WindowManager(683): at java.lang.reflect.Method.invokeNative(Native Method)
02-22 19:33:51.822: ERROR/WindowManager(683): at java.lang.reflect.Method.invoke(Method.java:507)
02-22 19:33:51.822: ERROR/WindowManager(683): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-22 19:33:51.822: ERROR/WindowManager(683): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-22 19:33:51.822: ERROR/WindowManager(683): at dalvik.system.NativeStart.main(Native Method)
02-22 19:33:47.881:WARN/dalvikvm(683):threadid=11:线程以未捕获异常退出(组=0x40015560)
02-22 19:33:47.881:错误/AndroidRuntime(683):致命异常:AsyncTask#3
02-22 19:33:47.881:错误/AndroidRuntime(683):java.lang.RuntimeException:执行doInBackground()时出错
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.os.AsyncTask$3.done(AsyncTask.java:200)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在java.lang.Thread.run(Thread.java:1019)处
02-22 19:33:47.881:错误/AndroidRuntime(683):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.os.Handler.(Handler.java:121)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.app.Dialog.(Dialog.java:101)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.app.AlertDialog.(AlertDialog.java:63)上
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.app.AlertDialog.(AlertDialog.java:59)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.app.AlertDialog$Builder.create(AlertDialog.java:786)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.app.AlertDialog$Builder.show(AlertDialog.java:801)上
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于en.android.albumdownloader.Main$LongOperation.doInBackground(Main.java:130)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在en.android.albumdownloader.Main$LongOperation.doInBackground(Main.java:1)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):在android.os.AsyncTask$2.call(AsyncTask.java:185)
02-22 19:33:47.881:ERROR/AndroidRuntime(683):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
02-22 19:33:47.881:错误/AndroidRuntime(683):。。。4更多
02-22 19:33:47.881:WARN/ActivityManager(71):强制完成活动en.android.albumdownloader/.Main
02-22 19:33:51.822:错误/WindowManager(683):活动en.android.albumdownloader.Main泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView@4057bdf0原来是加在这里的
02-22 19:33:51.822:错误/WindowManager(683):android.view.WindowLeaked:Activity en.android.albumdownloader.Main泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView@4057bdf0原来是加在这里的
02-22 19:33:51.822:错误/WindowManager(683):在android.view.ViewRoot(ViewRoot.java:258)上
02-22 19:33:51.822:ERROR/WindowManager(683):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-22 19:33:51.822:ERROR/WindowManager(683):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-22 19:33:51.822:错误/WindowManager(683):在android.view.Wi