2013-08-01 5 views
0

Я пытаюсь остановить приложение, если сетевой вызов недоступен.Try Catch not Catching Exception

Если сетевой вызов доступен, нажмите кнопку, чтобы перейти к следующему действию. Улов должен отображать тост.

Однако приложение все еще врезаться вместо отображения тост

Вот мой код: -

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

вместо этого проверить подключение к Интернету первый , Удалить примерки поймать блок и вызвать функцию 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-улов с этим:

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

проверить обновленный ответ для его реализации. просто замените ваш try-catch кодом, который я написал –

+0

Sir SC. Извините друга, но приложение все еще терпит крах при нажатии кнопки. Очень странно. Есть идеи? –

1

Используйте это, если вы 200% уверены, что вам нужно иметь свою сетевую активность в главном потоке, используйте:

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

в противном случае, посмотри на Threads и AsyncTasks.

+0

FD_ Это похоже на то, что мне нужно. Где это будет размещено? –

+0

В onCreate вашей деятельности. Но, обратите внимание, что это плохая практика, и вам следует подумать о переносе вашего сетевого кода в фоновый поток в долгосрочной перспективе. –

+0

Возможно, это повлияет на то, что мое приложение будет одобрено в Play Маркете? –

0

Его так как вы используете код на основной нити, поэтому он бросает NetworkOnMainThreadException. Это не в вашем коде, поэтому вы не можете его поймать и не пытаетесь поймать, потому что ваше приложение никогда не будет работать, потому что оно никогда не попытается сделать сетевое соединение из-за этой ошибки.

Вам необходимо выполнить сетевую активность в отдельном потоке, таком как ASyncTask, и это исключение больше не будет выбрано.

Причина этого исключения заключается в том, что сетевая активность обычно вызывает задержку в приложении, поскольку сетевые вызовы имеют тенденцию блокироваться до тех пор, пока они не будут завершены. Если сетевая активность выполняется в основном потоке, пользователи вашего приложения, скорее всего, получат сообщение ANR (приложение, не отвечающее), которое будет означать, что пользователь может заставить закрыть ваше приложение, поскольку оно выглядит так, как будто ваше приложение больше не отвечает ни на что, как на в фоновом режиме он выполняет сетевую активность.