2016-07-26 14 views
0

in meiner App, zeige ich ein ErrorFragment Objekt mit einer RETRY-Taste, um für das Internet erneut zu überprüfen, wenn es keine gibt. Wenn der Benutzer jedoch eine Internetverbindung hergestellt und auf die Schaltfläche RETRY geklickt hat, bleibt die Benutzeroberfläche für einige Sekunden hängen.Android: Überprüfung der Internetverbindung hängt die UI

Ich weiß nicht, diese Aufgabe auf dem Hauptthread auszuführen, so dass ich implementiert die folgenden:

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

    .... 
} 

Aber es hängt immer noch und die Benutzeroberfläche reagiert nicht. Wie kann ich dieses Problem beheben?

Dank

+0

Während, ja, Google, ist schnell zu reagieren, möchten Sie möglicherweise einen anderen Server als google für eine schnellere Ladezeit "ping". –

Antwort

1

Es hängt das UI, weil, obwohl Sie ein AsyncTask verwenden, können Sie es beginnen und dann sofort das Ergebnis davon versuchen .. Statt zu bekommen, die AsyncTask ‚s onPostExecute Methode verwenden, um entweder Last die Daten oder rufen Sie displayInternetError.

+0

Willst du 'hasInternetAccess' auf' onPostExecute' anstelle von 'doInBackground' aufrufen? – Pangu

+0

@Pangu Nein, ich sage, isConnectedToInternet eine void-Methode, die nur die AsyncTask startet. Und dann ruft die AsyncTask die entsprechende Methode selbst in onPostExecute auf. – Buddy

+0

Natürlich könnte es an diesem Punkt klarer sein, einige der Methoden umzubenennen: isConnectedToInternet -> checkIsConnectedToInternet, etc .. – Buddy

Verwandte Themen