应用程序在没有连接到网络时崩溃

时间:2014-02-01 15:10:12

标签: android android-asynctask crash jsoup connectivity

我试图从我的应用中的网站(某些文字)中获取一些信息。问题是有时我的方法不起作用。我已经构建了这个并用它来检查互联网连接:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager
            .getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

然而,有时手机告诉应用程序tere确实是一个互联网连接,当没有实际稳定的,然后应用程序崩溃。

信息的实际刷新是在Async任务中执行,并且像这样执行,其中crackerTask是我的异步任务:

if (this.isNetworkAvailable()) {

        crackerTask.execute(TESTSTRINGURL);}

     else {
        Toast.makeText(NewsAndAnnouncements.this,
                "No web connectivity. Try again later.", Toast.LENGTH_LONG)
                .show();
    }

当我的手机告诉应用程序有互联网时,如何避免程序崩溃,而没有?

编辑: 如果有帮助的话,这里是异步任务。

private class NewsAsyncTask extends AsyncTask<String, String, String> {

    ProgressDialog dialog1;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog1 = ProgressDialog.show(NewsAndAnnouncements.this, "Loading",
                "Fetching data from web...");
    }

    @Override
    protected String doInBackground(String... arguments) {
        // extract arguments
        String newsurl = arguments[0];
        //
        Document doc = null;
        try {
            doc = Jsoup.connect(newsurl).get();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        Elements myElements = doc.getElementsByClass("news_list");
        string1 = myElements.toString();
        Log.i("ELEMENTS HTML", string1);
        return string1;
    }

    @Override
    protected void onPostExecute(String result) {
        // super.onPostExecute(result);
        FINALSTRING = result;
        tv2.setText(FINALSTRING);
        if (dialog1 != null) {
            if (dialog1.isShowing()) {
                dialog1.dismiss();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

为什么不在AsyncTask内部移动检查连接呢?与之前检查然后运行任务以找出您没有它相反,为什么不在doInBackground内部实际执行任何内容之前直接检查AsyncTask内部。

编辑 :我想我可能已经弄清楚出了什么问题。您设置Document doc = null,然后在您的try语句中,将doc设置为您从互联网获得的任何内容。但是,如果这不起作用,那么doc仍然为空而且您继续前进,假设doc中有内容。让您的doInBackground看起来像这样:

protected String doInBackground(String... arguments) {
    // extract arguments
    String newsurl = arguments[0];
    //
    Document doc = null;
    try {
        doc = Jsoup.connect(newsurl).get();
        Elements myElements = doc.getElementsByClass("news_list");
        string1 = myElements.toString();
    Log.i("ELEMENTS HTML", string1);
    } catch (IOException e) {
        e.printStackTrace();
        string1 = null;
    } catch (NullPointerException e) {
        e.printStackTrace();
        string1 = null;
    }

    return string1;
}

onPostExecute中,检查result是否为空,并做相应的事情。

答案 1 :(得分:0)

检查互联网连接的方法

public boolean isConnectingToInternet()
{
        ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
          if (connectivity != null) 
          {
              NetworkInfo[] info = connectivity.getAllNetworkInfo();
              if (info != null) 
                  for (int i = 0; i < info.length; i++) 
                      if (info[i].getState() == NetworkInfo.State.CONNECTED)
                      {
                          return true;
                      }

          }
          return false;
    }

并在所需的活动中调用

cd = new ConnectionDetector(getApplicationContext());

    // Check if Internet present
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(push.this,
                "Internet Connection Error",
                "Please connect to working Internet connection", false);

        return;
    }