2016-04-19 14 views
0

Ich versuche, meine Hauptseite Aktivität zu starten, wenn eine Ausnahme ausgelöst wird. Gerade jetzt, wenn die Ausnahme auftritt, fährt die App herunter und startet von der Hauptseite. Ich möchte, dass es nahtlos zur Hauptseiten-App geht und den Benutzer nicht darauf hinweist, dass die App heruntergefahren wird. Der Fehler, den es mir gibt, ist dies:So behandeln Sie eine IOException, indem Sie eine neue Aktivität in Android starten

D/Issue with Http:: IOException 
04-19 13:57:31.518 27520-27570/myapp W/System.err: java.io.FileNotFoundException: my webpage 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238) 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at myapp.HttpManager.MyHttpGet.httpDownloadData(MyHttpGet.java:79) 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at myapp.HttpManager.MyHttpGet.doInBackground(MyHttpGet.java:53) 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at myapp.HttpManager.MyHttpGet.doInBackground(MyHttpGet.java:31) 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
04-19 13:57:31.518 27520-27570/myapp W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
04-19 13:57:31.519 27520-27570/myapp W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
04-19 13:57:31.519 27520-27570/myapp W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
04-19 13:57:31.519 27520-27570/myapp W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
04-19 13:57:31.519 27520-27570/myapp W/System.err:  at java.lang.Thread.run(Thread.java:818) 
04-19 13:57:31.538 27520-27520/myapp D/AndroidRuntime: Shutting down VM 
04-19 13:57:31.594 27520-27520/myapp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: myapp, PID: 27520 
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.contains(java.lang.CharSequence)' on a null object reference 
at myapp.JSON.LoginJsonParser.checkUsername(LoginJsonParser.java:41) 
at myapp.LoginPage$2.onClick(LoginPage.java:128) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Das ist schön und gut für Entwickler, aber ich möchte eine neue Aktivität starten, wenn dies geschieht. Was ich Code-weise für dieses Problem habe, ist dies.

private String httpDownloadData(String myUrl) 

{ 
    String respone = null; 
    HttpURLConnection urlConnection = null; 
    try 
    { 
     URL url = new URL(myUrl); 
     //put in the username and pssword for parmas to send to url 
     //this is good for login 
     if (username!=null) 
     { 
      Authenticator.setDefault(new Authenticator() { 
       @Override 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(username, password.toCharArray()); 
       } 
      }); 
     } 

     urlConnection = (HttpURLConnection)url.openConnection(); 
     InputStream inputStream = urlConnection.getInputStream(); 

     if(inputStream != null) 
     { 
      respone = streamToString(inputStream); 
      inputStream.close(); 
     } 

    }catch (IOException ie) 
    { 
     //ie.printStackTrace(); 
     Log.d("Issue with Http: " , "IOException"); 
     ie.printStackTrace(); 
     Intent newIntent = new Intent(activity.getApplicationContext(), ECom.class); 
     activity.startActivity(newIntent); 
    }finally { 
     if(urlConnection != null) 
     { 
      urlConnection.disconnect(); 
     } 
    } 
    return respone; 
} 

Vielen Dank für jede Hilfe mit diesem.

+0

Gemäß Ihren Protokolldetails löst Ihre App mehr als IOException aus. Haben Sie versucht, Exception anstelle von IOException in Ihrem catch-Block zu erfassen? –

+1

entweder catch für 'NullPointerException' oder auch' Exception' verwenden –

+0

@VivekMishra guter Punkt Ich dachte daran, nur zu versuchen, es zu stoppen, bevor es zu meinem jsonparser kommt, aber dann erkannte ich, dass mein JSON-Parser eine Aktivität starten kann, damit es funktioniert gut, jetzt danke dir – MNM

Antwort

2

Sie können keine Netzwerkoperation im UI-Thread durchführen, da dies zu einer networkOnMainThreadException führt. Bitte verwenden Sie AsyncTask, um Netzwerk- und Langzeitbetrieb durchzuführen. Sie können samples and docs here

oder verwenden volley einen Rahmen finden, um den Netzwerkbetrieb

+0

guter Punkt und es ist eine asynchrone Aufgabe, die nur zum Herunterladen von Daten von meinem Server gewidmet ist. – MNM

1

Sie sind Handling nur IOException in Fang kann es einen Fall geben, zu behandeln, wo es andere Ausnahmen in diesem Fall werfen wird es abstürzen .as ich sehen kann in Log für NPE auch so besser ist, stellen Sie sicher, was sonst Ausnahme Ihr Code kann durch oder andere Base Exception-Klasse, die alle Ausnahmen kümmern wird.

1

Sie müssen den Netzwerkbetrieb in dem neuen Thread sein ausführen, oder verwenden Sie den Rahmen, wie Volley, ist Okhhttp.Retrofit der beste Rahmen jetzt benutze ich, es enthält Okhttp und AsyncTask, aber Sie können die RxJava vereinigen wollen .

Verwandte Themen