Android 如果在获取JSON数据时没有internet连接或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

哎,, 我是android新手,有点小问题。我正在运行一个异步任务,在后台从web获取json数据。这很好,但是当没有internet连接或json解析错误或URL格式不正确时,应用程序强制关闭。有没有办法显示自定义错误而不是强制关闭应用程序?当然,要让应用程序保持打开状态。以下是我的简化代码:

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