当互联网不可用时,异步任务会崩溃Android上的应用程序

时间:2016-01-09 18:25:13

标签: android android-asynctask nullpointerexception okhttp

在我的Android应用程序中,我使用了异步任务来处理我的互联网请求。我通过使用okhttp library实现了这一点,这使得轻松发出互联网请求。我有很多代码包围了我的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:执行doInBackground()时发生错误                                                                                  在android.os.AsyncTask $ 3.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)                                                                                  在java.util.concurrent.FutureTask.run(FutureTask.java:137)                                                                                  在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)                                                                                  在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)                                                                                  at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569)                                                                                  在java.lang.Thread.run(Thread.java:856)                                                                               引起:java.lang.NullPointerException

请有人指出我的缺陷。我坚持这个。 所有的帮助将非常感谢,希望尽快解决这个问题。 感谢您的贡献。

2 个答案:

答案 0 :(得分:0)

您似乎忘记初始化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();
}

答案 1 :(得分:0)

似乎问题到底是用isSuccessul方法,这有点俗气,idk为什么,但是我使用if而不是它(response == null)。