gpt4 book ai didi

java - Android:检查互联网连接会挂起 UI

转载 作者:行者123 更新时间:2023-12-01 09:38:56 25 4
gpt4 key购买 nike

在我的应用程序中,我显示一个带有“重试”按钮的 ErrorFragment 对象,以重新检查互联网(如果没有)。但是,当用户建立互联网连接并单击“重试”按钮时,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 没有响应。我该如何解决这个问题?

谢谢

最佳答案

它会挂起 UI,因为即使您使用 AsyncTask,您也会启动它,然后立即尝试获取它的结果。相反,请使用 AsyncTask > 的 onPostExecute 方法加载数据或调用 displayInternetError

关于java - Android:检查互联网连接会挂起 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com