をハングアップ、私が存在しない場合は、インターネットに再確認するためにRETRYボタンでErrorFragment
オブジェクトを表示します。しかし、ユーザーがインターネット接続を確立し、RETRYボタンをクリックすると、UIが数秒間ハングします。アンドロイド:チェックインターネット接続は私のアプリで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;
}
....
}
しかし、それはまだハングとUIが応答しません。この問題を解決するにはどうすればよいですか?あなたがAsyncTask
を使用しているにもかかわらず、あなたがそれを始めているし、すぐに代わり、いずれかの負荷にAsyncTask
のonPostExecute
メソッドを使用します。..それの結果を取得しようとしているので、それがUIをハング
おかげ
ている間は、はい、Googleは、あなたは「ピング」より速くロード時のためのGoogle以外のサーバーにしたいことがあり、対応が迅速です。 –