如何通过在 android 中启动新的 Activity 来处理 IOException
How to handle a IOException by starting a new Activity in android
我正试图在抛出异常时启动我的主页 activity。现在当异常发生时,应用程序关闭并从主页启动。我想让它无缝地转到主页面应用程序,而不是让用户警告应用程序正在关闭。它给我的错误是:
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.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.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.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)
这对开发人员来说很好,但我想在发生这种情况时开始一个新的 activity。我对这个问题的代码是这样的。
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;
}
感谢您对此的任何帮助。
你不能在UI线程中执行任何网络操作,它会给你networkOnMainThreadException。请使用 AsyncTask 执行网络和长 运行 操作。你可以找到 samples and docs here
或使用volley框架来处理网络操作
您在 catch 中仅处理 IOException 可能会抛出其他异常,在这种情况下它会崩溃。正如我在 Log for NPE 中看到的那样,最好确保您的代码还可以抛出其他异常通过或者使用 base Exception class 来处理所有异常。
你必须在新的线程中进行网络操作,或者使用框架,比如Volley,Okhhttp.Retrofit是我现在使用的最好的框架,它包含Okhttp和AsyncTask,但你可能想要联合 RxJava.
我正试图在抛出异常时启动我的主页 activity。现在当异常发生时,应用程序关闭并从主页启动。我想让它无缝地转到主页面应用程序,而不是让用户警告应用程序正在关闭。它给我的错误是:
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.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.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.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)
这对开发人员来说很好,但我想在发生这种情况时开始一个新的 activity。我对这个问题的代码是这样的。
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;
}
感谢您对此的任何帮助。
你不能在UI线程中执行任何网络操作,它会给你networkOnMainThreadException。请使用 AsyncTask 执行网络和长 运行 操作。你可以找到 samples and docs here
或使用volley框架来处理网络操作
您在 catch 中仅处理 IOException 可能会抛出其他异常,在这种情况下它会崩溃。正如我在 Log for NPE 中看到的那样,最好确保您的代码还可以抛出其他异常通过或者使用 base Exception class 来处理所有异常。
你必须在新的线程中进行网络操作,或者使用框架,比如Volley,Okhhttp.Retrofit是我现在使用的最好的框架,它包含Okhttp和AsyncTask,但你可能想要联合 RxJava.