当互联网不可用时,异步任务使应用程序在 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) 代替它。