2013-08-01 218 views
0

如果网络调用不可用,我试图阻止应用程序崩溃。尝试抓住不捕捉异常

如果网络通话可用,然后我想点击按钮继续进入下一个活动。该捕获应该显示一个敬酒。

但是应用程序仍然会崩溃,而不是显示敬酒

这里是我的代码: -

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(); 
     } 

logcat的: -

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 
+0

你会得到任何错误? –

+0

你试过调试过吗? –

+0

为什么在开始下一个活动之前不检查连接性? – gunar

回答

1

,而不是它首先检查网络连接。删除try-catch块,并调用isOnline功能,如果代码 - >if(isOnline()){}

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:

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(); 
} 
+0

我对如何实现ifisonline有点困惑。我有一个onclick布局按钮。我如何以这种方式做这项工作? –

+0

检查实施它的更新答案。只需用我写的 –

+0

爵士代码替换你的try-catch。对不起朋友,但点击该按钮后,应用程序仍然崩溃。很奇怪。有任何想法吗? –

1

使用这个,如果你是200%肯定,你需要在主线程您的网络活动,请使用:

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

否则,看看ThreadsAsyncTasks

+0

FD_看起来像我需要的东西。这将被放置在哪里? –

+0

在您的活动的onCreate。但是,请注意,这是不好的做法,您应该考虑将您的网络代码长期运行到后台线程。 –

+0

这可能会影响我的应用程序在Play商店中获得批准吗? –

0

因为您正在主线程上运行代码,所以它会抛出NetworkOnMainThreadException。这不是在你的代码中,所以你不能捕捉它,也不应该试图捕捉它,因为你的应用程序将永远不会工作,因为它将永远不会尝试进行网络连接,由于这个错误。

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

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