2016-07-26 5 views
0

в моем приложении. Я показываю объект ErrorFragment с кнопкой RETRY, чтобы перепроверить Интернет, если его нет. Однако, когда пользователь установил подключение к Интернету и нажал кнопку RETRY, пользовательский интерфейс зависает на пару секунд.Android: проверка подключения к интернету зависает UI

Я не знаю, чтобы выполнить эту задачу в основном потоке, так что я реализовал следующие:

public class MainFragment extends VerticalGridFragment 
{ 
    .... 

    if (isConnectedToInternet() == true) 
    { 
     // Load data 
    } 
    else 
    { 
     displayInternetError(); 
    } 

    public void displayInternetError() 
    { 
     Log.d(TAG, "displayInternetError"); 

     final ErrorFragment error = new ErrorFragment(); 

     getFragmentManager().beginTransaction().replace(R.id.main_browse_fragment, error) 
       .commit(); 

     error.setImageDrawable(getResources().getDrawable(R.drawable.lb_ic_sad_cloud, null)); 
     error.setMessage(getResources().getString(R.string.no_internet_message)); 
     error.setDefaultBackground(true); 

     error.setButtonText(getResources().getString(R.string.retry_connection)); 

     error.setButtonClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View arg0) 
      { 
       if (isConnectedToInternet() == true) 
       { 
        getFragmentManager().beginTransaction().remove(error).commit(); 
        getFragmentManager().popBackStack(); 

        Singleton.getInstance().setInternetErrorShown(false); 
        prepareBackgroundManager(); 
        setupFragment(); 
        setupEventListeners(); 
       } 
       else 
       { 
        Singleton.getInstance().setInternetErrorShown(true); 
       } 
      } 
     }); 
    } 

    ... 

    private class GetInternetStatus extends AsyncTask<Void,Void,Boolean> 
    { 
     @Override 
     protected Boolean doInBackground(Void... params) 
     { 
      return hasInternetAccess(); 
     } 

     protected boolean hasInternetAccess() 
     { 
      try 
      { 
       URL url = new URL("http://www.google.com"); 

       HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
       urlc.setRequestProperty("User-Agent", "Android Application:1"); 
       urlc.setRequestProperty("Connection", "close"); 
       urlc.setConnectTimeout(1000 * 30); 
       urlc.connect(); 

       // http://www.w3.org/Protocols/HTTP/HTRESP.html 
       if (urlc.getResponseCode() == 200 || urlc.getResponseCode() > 400) 
       { 
        // Requested site is available 
        return true; 
       } 
      } 
      catch (Exception ex) 
      { 
       // Error while trying to connect 
       ex.printStackTrace(); 
       return false; 
      } 
      return false; 
     } 
    } 

    // Checking for all possible internet connections 
    public boolean isConnectedToInternet() 
    { 
     Boolean result = false; 

     try 
     { 
      // Get the result after executing AsyncTask 
      result = new GetInternetStatus().execute().get(); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (ExecutionException e) 
     { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    .... 
} 

Но она по-прежнему висит и пользовательский интерфейс не отвечает на запросы. Как я могу решить эту проблему?

Благодаря

+0

Хотя, да, Google быстро реагирует, вы можете захотеть «ping» на сервере, отличном от Google, для более быстрой загрузки. –

ответ

1

Он висит интерфейс, потому что даже если вы используете AsyncTask, вы начинаете его, а затем сразу же пытается получить результат этого .. Вместо этого используйте AsyncTask «s onPostExecute метод для любой нагрузки данные или вызов displayInternetError.

+0

Вы хотите вызвать 'hasInternetAccess' на' onPostExecute' вместо 'doInBackground'? – Pangu

+0

@Pangu Нет, я говорю, чтобы сделать isConnectedToInternet методом void, который просто запускает AsyncTask. И тогда AsyncTask вызовет соответствующий метод изнутри onPostExecute. – Buddy

+0

Конечно, в этот момент может быть яснее переименовать некоторые из методов: isConnectedToInternet -> checkIsConnectedToInternet и т. Д. – Buddy

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