2013-08-01 205 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(應用程序無響應)消息,這意味着用戶可以強制關閉應用程序,因爲它看起來好像應用程序不再響應任何內容在後臺執行網絡活動。