Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 没有网络连接时应用程序崩溃_Android_Android Asynctask_Crash_Jsoup_Connectivity - Fatal编程技术网

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

Android 没有网络连接时应用程序崩溃,android,android-asynctask,crash,jsoup,connectivity,Android,Android Asynctask,Crash,Jsoup,Connectivity,我正在尝试从我的应用程序中的网站(一些文本)获取一些信息。问题是有时候我的方法不起作用。我已经构建了这个,并使用它检查互联网连接: private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork

我正在尝试从我的应用程序中的网站(一些文本)获取一些信息。问题是有时候我的方法不起作用。我已经构建了这个,并使用它检查互联网连接:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager
            .getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
然而,有时手机会告诉应用程序tere确实是一个互联网连接,而实际上没有稳定的连接,然后应用程序崩溃

信息的实际刷新在异步任务中,执行方式如下,其中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();
            }
        }
    }
}
私有类NewsAsyncTask扩展了AsyncTask{
对话1;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
dialog1=ProgressDialog.show(newsandAnnounces.this,“加载”,
“正在从web获取数据…”);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
//提取参数
字符串newsurl=参数[0];
//
单据单据=空;
试一试{
doc=Jsoup.connect(newsurl.get();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(NullPointerException e){
e、 printStackTrace();
}
Elements myElements=doc.getElementsByClass(“新闻列表”);
string1=myElements.toString();
Log.i(“元素HTML”,string1);
返回字符串1;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//super.onPostExecute(结果);
最后一环=结果;
tv2.setText(FINALSTRING);
if(dialog1!=null){
如果(dialog1.isShowing()){
对话1.解散();
}
}
}
}

那么,为什么不将连接检查移到AsyncTask内部呢?与之前检查然后运行任务以发现您没有任务不同,为什么不在实际使用internet之前直接检查AsyncTask内部,在
doInBackground
内部

编辑:我想我可能已经找出了问题所在。您可以设置
Document doc=null
,然后在try语句中,将
doc
设置为从internet获得的任何内容。但是,如果这不起作用,您的
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
是否为空,并相应地执行操作。

检查internet连接的方法

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;
    }

此外,我无法真正告诉您日志结果,因为我无法真正模拟具有活动网络但internet较差的情况:(我会尝试一下,虽然我不知道这对解决问题有什么帮助?你几乎描述了正在发生的事情:用户的互联网似乎有点不稳定。你会有一秒钟的连接,但下一秒钟它就消失了,这确实发生了。检查连接和完成工作之间的差距可能太大,尽管我可能是错的。此外,can您发布日志,以便我们能够准确了解问题所在?问题是我家里没有不稳定的互联网。我无法模拟计算机周围发生的情况,因为手机和wifi都很好,因此-无法获取此错误的日志:D(第一世界问题)我想要以下解决方案-当互联网关闭而已经刷新时,我不希望应用程序强制关闭。可能已经为您找到了一个更有用的解决方案。更新了我的答案。谢谢!我会在一两个小时内尝试一下,并会告诉您它是否有效。顺便说一句,它看起来非常合乎逻辑,如果这是问题的话,那就太好了。我不会如果有效的话,你能详细解释一下为什么这样更好吗?我想更好地理解这个问题。
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;
    }