Daniel Levi
Daniel Levi

Reputation: 291

Hide/Show ProgressBar using AsyncTask

I'm trying to do the simple act of hiding/showing ProgressBar according to AsyncTask state , I have two classes one extends FragmentActivity and second AsyncTask.

MainActivity.java

public class MainActivity extends FragmentActivity {

public static ProgressBar mProgressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
}

@Override
protected void onStart() {
    super.onStart();
    // What will happen to the progress bar here?  
}

@Override
protected void onStop() {
    super.onStop();
  // What will happen to the progress bar here? 
}

       @Override
        protected void onResume() {
        super.onResume();

      // What will happen to the progress bar here? 
    }
    }

MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Void,Void, Void> {

@Override
protected Void doInBackground() {
    // start download some images from cloud 
    // Here the progress bar should start to appear in MainActivity
    // mProgressBar.setVisibility(View.VISIBLE);

}

@Override
protected void onPostExecute(Void result) {
    Log.d(TAG, "Finished book downloading images the cloud");
   // Here the progress bar should start to disappear in MainActivity
   // mProgressBar.setVisibility(View.GONE);


}

}

main_activity.xml

      <ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminate="true" />

Hope you understand me, thank to everyone who can help.

Upvotes: 2

Views: 2895

Answers (4)

BarmanInfo
BarmanInfo

Reputation: 392

Use interface in Asyntask class for communicate with Activity class

public class MyAsyncTask extends AsyncTask<Void,Void,Void> {

//use context for activity reference
private Context context_;

public MyAsyncTask(Context context) {
    this.context_=context;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Void doInBackground(Void... voids) {
    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    if(mCallBack!=null ){
        mCallBack.onSuccess("Success");
    }else {
        mCallBack.onError("Error");

    }
}

MyAsyncCallBack mCallBack=null;

public MyAsyncCallBack getmCallBack() {
    return mCallBack;
}

public void setmCallBack(MyAsyncCallBack mCallBack) {
    this.mCallBack = mCallBack;
}

public interface MyAsyncCallBack{
    public void onSuccess(String successMessage);
    public void onError(String successMessage);
}

}

Call AsynckTask Class from activity class.Before calling asyntask start progress. and after completing work in asyntask return activity via interface and hide progress.

startProgress();
    MyAsyncTask mTask=new MyAsyncTask(YourActivity.this);
    mTask.setmCallBack(new MyAsyncTask.MyAsyncCallBack() {
        @Override
        public void onSuccess(String successMessage) {
            //do success work and hide progress
            hideProgress();
        }

        @Override
        public void onError(String successMessage) {
            //do error work and hide progress
            hideProgress();
        }
    });
    mTask.execute();

Upvotes: 0

cowboi-peng
cowboi-peng

Reputation: 803

public class MyAsyncTask extends AsyncTask<Void,Void, Void> {
@Override
protected void onPreExecute(Void result) {
    Log.d(TAG, "Finished book downloading images the cloud");
   // Here the progress bar should start to disappear in MainActivity
    mProgressBar.setVisibility(View.VISIBLE);


}
@Override
protected Void doInBackground() {
// start download some images from cloud 
// there is a time cost operation


}

@Override
protected void onPostExecute(Void result) {
    Log.d(TAG, "Finished book downloading images the cloud");
   // Here the progress bar should start to disappear in MainActivity
   // mProgressBar.setVisibility(View.GONE);


}

}

You should use onPreExecute() method to show the dialog.

Here is MainActivity

@Override
protected void onResume() {
    super.onResume();
    new MyAsyncTask().execute();
}

I think you should read APIs first.

Upvotes: 1

Nayan Srivastava
Nayan Srivastava

Reputation: 3725

Use preExecute and postExecute methods as they run on UI thread.

public class MyAsyncTask extends AsyncTask<Void,Void, Void> {

ProgressBar pBar;
@Override
protected void onPreExecute(Void result) {
pBar=new ProgressBar(getContext());
pBar.show();
}

@Override
protected void onPostExecute(Void result) {
   if(pBar !=null and pBar.isShowing()){
  pBar.dismiss();
}
}

}

Upvotes: 0

Farouk Touzi
Farouk Touzi

Reputation: 3456

The progress bar should appear in onPreExecute() method (still in UI thread). Then you dismiss it when you get back to UI thread in onPostExecute method.

Upvotes: 2

Related Questions