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