当互联网不可用时,异步任务使应用程序在 android 上崩溃
Async task crashes the aplication on android when internet is unavailable
在我的 android 应用程序中,我使用异步任务来处理我的互联网请求。我通过使用 okhttp library 实现了这一点,这使得发出互联网请求变得容易。我的 try/catch 语句周围有很多代码,但是当出现未处理的异常时它们不会以某种方式触发,因此应用程序崩溃。只有当互联网断开连接或在某些地区速度很慢时才会发生这种情况。
我找过类似的帖子,但发现有同样问题的人没有try/catch,所以没有处理异常
我也尝试过制作一个互联网可访问性检查器,但效果不太好,因为我更愿意用干净的尝试捕捉来做它。
private class prenesi extends AsyncTask<String, Void, String>
{
String odgovor = null;
protected String doInBackground(String... params)
{
OkHttpClient client = new OkHttpClient();
RequestBody vsebina = new FormEncodingBuilder()
.add("kraj", params[0])
.build();
Request request = new Request.Builder()
.url("http://mypage.com/login.php")
.post(vsebina)
.build();
Response response = null;
try
{
response = client.newCall(request).execute();
}
catch (IOException e)
{
e.printStackTrace();
}
if (!response.isSuccessful())
{
odgovor = "Napaka.";
}
else
try
{
odgovor = response.body().string();
}
catch (IOException e)
{
e.printStackTrace();
}
return odgovor;
}
}
devconsole 说问题出在 doInBackground() 中,我猜这是因为空指针异常引起的,尽管我不完全确定那是什么意思:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
请有人指出我的缺陷。我坚持这个。
所有的帮助将不胜感激,希望尽快解决这个问题。
感谢贡献。
您似乎忘记了初始化 String
值。 运行 首先设置 String odgovor="";
而不是 String odgovor= null;
尝试将代码修改成这样
String odgovor="";
try{
response = client.newCall(request).execute();
if (!response.isSuccessful()) {
odgovor = "Napaka.";
} else{
odgovor = response.body().string();
}} catch (IOException e) {
e.printStackTrace();
}
似乎问题最终出在 isSuccessul 方法上,这有点俗气,我不知道为什么,但我使用了 if(response == null) 代替它。
在我的 android 应用程序中,我使用异步任务来处理我的互联网请求。我通过使用 okhttp library 实现了这一点,这使得发出互联网请求变得容易。我的 try/catch 语句周围有很多代码,但是当出现未处理的异常时它们不会以某种方式触发,因此应用程序崩溃。只有当互联网断开连接或在某些地区速度很慢时才会发生这种情况。
我找过类似的帖子,但发现有同样问题的人没有try/catch,所以没有处理异常 我也尝试过制作一个互联网可访问性检查器,但效果不太好,因为我更愿意用干净的尝试捕捉来做它。
private class prenesi extends AsyncTask<String, Void, String>
{
String odgovor = null;
protected String doInBackground(String... params)
{
OkHttpClient client = new OkHttpClient();
RequestBody vsebina = new FormEncodingBuilder()
.add("kraj", params[0])
.build();
Request request = new Request.Builder()
.url("http://mypage.com/login.php")
.post(vsebina)
.build();
Response response = null;
try
{
response = client.newCall(request).execute();
}
catch (IOException e)
{
e.printStackTrace();
}
if (!response.isSuccessful())
{
odgovor = "Napaka.";
}
else
try
{
odgovor = response.body().string();
}
catch (IOException e)
{
e.printStackTrace();
}
return odgovor;
}
}
devconsole 说问题出在 doInBackground() 中,我猜这是因为空指针异常引起的,尽管我不完全确定那是什么意思:
java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask.done(AsyncTask.java:299) at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) Caused by: java.lang.NullPointerException
请有人指出我的缺陷。我坚持这个。 所有的帮助将不胜感激,希望尽快解决这个问题。 感谢贡献。
您似乎忘记了初始化 String
值。 运行 首先设置 String odgovor="";
而不是 String odgovor= null;
尝试将代码修改成这样
String odgovor="";
try{
response = client.newCall(request).execute();
if (!response.isSuccessful()) {
odgovor = "Napaka.";
} else{
odgovor = response.body().string();
}} catch (IOException e) {
e.printStackTrace();
}
似乎问题最终出在 isSuccessul 方法上,这有点俗气,我不知道为什么,但我使用了 if(response == null) 代替它。