来自 AsyncTask 的静态方法调用是异步的?

Static method call from AsyncTask is async?

我正在尝试使用 AsyncTask 检查互联网连接是否可用,然后做一些事情。

我的问题是在执行缓刑期间我无法与 UI 互动。 “progressbar”在前面,如果我尝试单击按钮,UI 没有响应

这是对 AsyncTask 的调用

@Override
    public void onStart(){
        super.onStart();
            AsyncHttpHandler check = new AsyncHttpHandler(**paramaters**);
            check.execute("checkshared"); 

    }

这是AsyncTask的代码

public class AsyncHttpHandler extends AsyncTask<String, Integer, String>{


    public AsyncHttpHandler(Context c, Intent i, Bundle _data, String _language){
        ctx = c;
        intent = i;
        data = _data;
        language = _language;

        startClock();


    }

    public void startClock(){
        mDialog = new ProgressDialog(ctx,R.style.MyTheme);                  
        mDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
        mDialog.setCancelable(false);
        mDialog.show();
    }


    @SuppressWarnings("unchecked")
    @Override
    protected String doInBackground(String... peticion) {
        String response = "null";
        //call to check if internet connection is available
        if(Utils.isInternetConn(ctx)){

        try {

            // do stuff
            response = "...";

        }
        else response = "offline";

        return response;
        }
    }

    protected void onPostExecute(String response) {
        if(mDialog != null) mDialog.dismiss();

        if(!response.equals("offline")){
        // do stuff
        }
        else Toast.makeText(ctx, ctx.getResources().getString(ctx.getResources().getIdentifier(language+"_toast_nointernet", "string", ctx.getPackageName())), Toast.LENGTH_LONG).show();

    }



}

这是检查互联网连接是否可用的方法:

public static Boolean isInternetConn(Context ctx){

    ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo wifi = connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo mobile = connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    boolean conectado = false;
    if((wifi != null && wifi.isConnectedOrConnecting()) || (mobile != null && mobile.isConnectedOrConnecting())){   

        try {

            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();             
            StrictMode.setThreadPolicy(policy);
            URL myurl = new URL("http://www.google.com");
            URLConnection connection;
            connection = myurl.openConnection();
            connection.setConnectTimeout(2000);
            connection.setReadTimeout(2000);
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            int responseCode = -1;
            responseCode = httpConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                  conectado = true;
                  httpConnection.disconnect();
            }
            else {
                httpConnection.disconnect();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();                
        }
    }

  return conectado;
}

我做错了什么?

问题不在于您的 AsyncTask 调用静态方法。这也将执行异步。问题是您在任务完成之前显示进度对话框。当然,当您的进度对话框可见时,您将无法与 UI 进行交互。如果您想与 UI 互动,请以另一种方式显示您的进度,而不是通过对话。

您在屏幕顶部显示一个进度对话框。进度对话框采用 UI 交互,因此下面的按钮没有响应。如果您在 UI 中使用进度条而不是进度对话框,您的按钮将起作用。

如果您想向用户显示任务的进度,请使用方法onProgressUpdate,因为它已在 运行 上实施UI 线程。

现在,每次您想显示 doInBackground 的进度时,通过传递参数来调用它。明确地说,AsyncTask (String, Integer, String) 使用参数类型:

  • 首先是调用 execute 时传递的参数类型
  • 其次是您传递给 onProgressUpdate 的参数类型
  • 第三个是你传递给 onPostExecute 的参数类型

我不确定我是否理解您的问题,但在我看来,您无法与 UI 交互,因为 ProgressDialog 不可取消,而且它位于其他所有内容的前面。 您只会在关闭对话框时收到反馈。