2014-02-01 2 views
0

Я пытаюсь получить информацию с веб-сайта (некоторый текст) в своем приложении. Проблема в том, что иногда мой метод не работает. Я построил это и использовать его для проверки подключения к Интернету:Ошибка приложения при отсутствии подключения к сети

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

Однако, иногда телефонам сказать приложению, которое тер действительно является подключением к Интернету, когда нет фактической стабильных один, а затем приложение падает.

Фактические обновлённая информации находится в задаче асинхронной и выполняется, как это, где crackerTask моя асинхронная задача:

if (this.isNetworkAvailable()) { 

     crackerTask.execute(TESTSTRINGURL);} 

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

Как я могу избежать аварий программы, когда мой телефон говорит приложение есть интернет, а нет?

EDIT: вот асинхронная задача, если это помогает.

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(); 
      } 
     } 
    } 
} 
+0

также, я не могу сказать вам результаты журнала, потому что я не могу имитировать ситуация с активной сетью, но плохой интернет :( – NoodlesFromHell

ответ

2

Почему вы не переставляете чек для подключения внутри AsyncTask? В отличие от проверки до и после выполнения задачи, чтобы узнать, что у вас ее нет, почему бы не проверить внутри AsyncTask DIRECTLY, прежде чем делать что-либо с Интернетом, внутри doInBackground.

EDIT: Я думаю, что я, возможно, понял, что это не так. Вы устанавливаете 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 является недействительным и сделать что-то соответствующим образом.

+0

попробует, хотя я не знаю, как это могло бы помочь в проблеме? – NoodlesFromHell

+0

Вы в значительной степени описали, что происходит: кажется, у пользователя есть пятнистый интернет. У меня есть связь в одну секунду, а некс t это ушло, что происходит. Разрыв между проверкой соединения и выполнением работы может быть слишком далеко друг от друга, хотя я могу ошибаться. Кроме того, можете ли вы разместить свой логарифм, чтобы мы могли точно увидеть, в чем проблема? – kentarosu

+1

проблема в том, что у меня нет пятнистого интернет дома. Я не могу имитировать то, что происходит вокруг моего компьютера, потому что и мобильный, и Wi-Fi хороши и, следовательно, - не могут получить логарифм от этой ошибки: D (проблемы первого мира), я хочу следующее разрешение - когда интернет идет вниз Обновление не требует, чтобы приложение принудительно закрывалось. – NoodlesFromHell

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

Я попробую. Если это сработает, вы можете уточнить, почему это лучше? Я хочу лучше понять проблему. – NoodlesFromHell

Смежные вопросы