Hanzo
Hanzo

Reputation: 1899

Static method call from AsyncTask is async?

I'm trying to use a AsyncTask to check if internet connection is available and then doing some stuff.

My problem is while the comprobation is being executed I can´t interacting with the UI. The "progressbar" is on front and if I try to click on a button the UI doesn't respond

This is the call to AsyncTask

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

    }

This is the code of 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();

    }



}

And this is the method to check if the internet connection is available:

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;
}

What am I doing wrong?

Upvotes: 2

Views: 982

Answers (4)

S&#233;rgio Moura
S&#233;rgio Moura

Reputation: 136

I'm not sure if I understood what is your problem, but it seems to me, that you cannot interact with UI because the ProgressDialog is not cancelable, and it's in front of everything else. You will only have feedback when dialog is dismissed.

Upvotes: 0

Gordak
Gordak

Reputation: 2070

If you want to show the progress of your task to the user, use the method onProgressUpdate, as it has been implemented to run on the UI thread.

Now, each time you want to show the progress from doInBackground, call it by passing an argument. To be clear, AsyncTask (String, Integer, String) uses argument types:

  • First is the type of argument you pass when you call execute
  • Second is the type of the argument you pass to onProgressUpdate
  • Third is the type of argument you pass to onPostExecute

Upvotes: 0

Christine
Christine

Reputation: 5575

You display a progressDialog on top of the screen. The progress dialog takes the UI interaction, so the buttons underneath don't respond. If you use a progress bar in your UI instead of a progress dialog, your buttons will work.

Upvotes: 1

Dalija Prasnikar
Dalija Prasnikar

Reputation: 28512

The problem is not in your AsyncTask calling static method. That will also execute async. Problem is that you are showing progress dialog until your task finishes. And, of course, while your progress dialog is visible you will not be able to interact with the UI. If you want to interact with the UI, show your progress in another way, not with dialog.

Upvotes: 1

Related Questions