首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试捕获未捕获异常

尝试捕获未捕获异常
EN

Stack Overflow用户
提问于 2013-08-01 18:48:08
回答 3查看 2K关注 0票数 0

如果网络呼叫不可用,我正在尝试阻止应用程序崩溃。

如果网络呼叫可用,则单击按钮继续下一项活动。捕获物应显示吐司。

然而,应用程序仍然崩溃,而不是显示吐司

以下是我的代码:

代码语言:javascript
复制
public void GoToStation(View v)
{

        try {

            Intent myIntent = new Intent(
                             MainActivity.this, CustomizedListViewStation.class);
            startActivityForResult(myIntent, 0);
        } catch (Exception myIntent) {
            // TODO Auto-generated catch block
            Context context = getApplicationContext();
            CharSequence text = "There is no data for this Community";
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

日志:-

代码语言:javascript
复制
08-01 12:36:56.944: E/AndroidRuntime(32556): FATAL EXCEPTION: main
08-01 12:36:56.944: E/AndroidRuntime(32556): java.lang.RuntimeException: Unable to start     activity     ComponentInfo{police.uk.greatermanchesterpoliceandroid/police.uk.greatermanchesterpoliceandroid.CustomizedListViewStation}: android.os.NetworkOnMainThreadException
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.Looper.loop(Looper.java:137)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.main(ActivityThread.java:4898)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.lang.reflect.Method.invoke(Method.java:511)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at dalvik.system.NativeStart.main(Native Method)
08-01 12:36:56.944: E/AndroidRuntime(32556): Caused by: android.os.NetworkOnMainThreadException
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at police.uk.greatermanchesterpoliceandroid.XMLParser.getXmlFromUrl(XMLParser.java:45)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at police.uk.greatermanchesterpoliceandroid.CustomizedListViewStation.onCreate(CustomizedListViewStation.java:108)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.Activity.performCreate(Activity.java:5206)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
08-01 12:36:56.944: E/AndroidRuntime(32556):    ... 11 more
08-01 12:37:05.694: I/Process(32556): Sending signal. PID: 32556 SIG: 9
EN

回答 3

Stack Overflow用户

发布于 2013-08-01 18:54:59

而不是它首先检查互联网连接。删除try-catch块并在if code -> if(isOnline()){}中调用isOnline函数:

代码语言:javascript
复制
public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

将try-catch替换为以下内容:

代码语言:javascript
复制
if (isOnline()){
    Intent myIntent = new Intent(MainActivity.this, CustomizedListViewStation.class);
    startActivityForResult(myIntent, 0);
} 

else {            
    Context context = getApplicationContext();
    CharSequence text = "There is no data for this Community";
    int duration = Toast.LENGTH_LONG;
    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}
票数 1
EN

Stack Overflow用户

发布于 2013-08-01 19:01:10

如果您200%确定需要将网络活动放在主线程中,请使用以下命令:

代码语言:javascript
复制
if (android.os.Build.VERSION.SDK_INT > 9) {
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
}

否则,请看一下ThreadsAsyncTasks

票数 1
EN

Stack Overflow用户

发布于 2013-08-02 00:16:13

这是因为你是在主线程上运行代码,所以它抛出了一个NetworkOnMainThreadException。这不在你的代码中,所以你不能捕获它,你也不应该尝试捕获它,因为你的应用程序永远不会工作,因为它永远不会因为这个错误而尝试建立网络连接。

您需要在单独的线程(如ASyncTask )中执行网络活动,并且将不再抛出此异常。

此异常的原因是网络活动通常会导致应用程序延迟,因为网络调用往往会阻塞,直到完成。如果在主线程上执行网络活动,则应用程序的用户可能会收到ANR (应用程序未响应)消息,这意味着用户可以强制关闭您的应用程序,因为它看起来好像您的应用程序不再响应任何事情,因为它在后台执行网络活动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17991919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档