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

标签 java android

在我的应用程序中,我显示一个带有“重试”按钮的 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/

相关文章:

Android:打开从电子邮件客户端附件传递到 Activity 的文件查看 Intent

android - 暂停 Activity

android - 错误 :Configuration with name 'default' not found when trying to import project as library into Android Studio

Android viewpager weight - 全屏主题

Java 数组中的最小值和最大值

java - Java String 构造函数是如何实现的?

java - NULL 上的方法调用工作正常 - 期待 NPE

java - 试图让 Spring SecurityConfig 与 Spring MVC 和 JavaConfig 一起工作

java - 如何搭建小型文件存储?

java - 在运行时导入自签名证书的 SSL 客户端-服务器在握手时失败