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

时间:2015-06-30 11:02:34

标签: android android-asynctask

我正在尝试使用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;
}

我做错了什么?

4 个答案:

答案 0 :(得分:1)

问题不在于AsyncTask调用静态方法。那也将执行异步。问题是您正在显示进度对话框,直到您的任务完成。当然,当您的进度对话框可见时,您将无法与UI进行交互。如果您想与UI进行交互,请以其他方式显示您的进度,而不是使用对话框。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

现在,每次要显示doInBackground的进度时,都要通过传递参数来调用它。为了清楚起见, AsyncTask(String,Integer,String)使用参数类型:

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

答案 3 :(得分:0)

我不确定我是否明白你的问题是什么,但在我看来,你不能与UI互动,因为ProgressDialog不可取消,而且它在其他一切之前。 只有在解除对话框时才会收到反馈。