如何从AsyncTask显示和隐藏活动的ProgressBar?

时间:2014-02-03 13:43:31

标签: android android-layout android-asynctask android-activity android-progressbar

我创建了一个单独的类,它扩展了我在整个应用程序中用于通信的AsyncTask。我的类的每个活动都使用此AsyncTask类进行通信。我想在通信进行时显示ProgressBar(活动指示符)。如果我在使用通信类的活动中显示和隐藏ProgressBar,则ProgressBar会冻结,直到通信完成。有没有办法在AsyncTask类的屏幕中间显示ProgressBar,因此它不会冻结,并且用户知道后台发生了一些事情。我使用以下代码:

  public class MyActivity extends Activity {

      ProgressBar spinner;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.my_activity_layout);

         spinner = (ProgressBar)findViewById(R.Id.progressbar); 
         spinner.setVisibility(ProgressBar.INVISIBLE);
      }

      protected void onResume()
      {
         super.onResume();
      }

      public void buttonClickHandler(View target){
         try{
            spinner.setVisibility(ProgressBar.VISIBLE);
            String output = new SendRequest().execute().get();      
            spinner.setVisibility(ProgressBar.INVISIBLE);           
         }catch(Exception ex){
            System.out.println("buttonClickHandler exception: "+ex);
         }
      }
  }

和AsyncTask类是:

  public class SendRequestExample extends AsyncTask<ArrayList<String>, Void, String> {
      public String result; 

          protected String doInBackground(ArrayList<String>... params) {

              // doing communication 
              ...

              return result;
          }      
  }

提前致谢。

4 个答案:

答案 0 :(得分:5)

您应该在以下位置显示进度条:

SendRequestExample.onPreExecute()

并将其隐藏在:

SendRequestExample.onPostExecute()

方法

如果您的SendRequestExample对于许多活动都是通用的,那么您可以创建MyActivity实现界面,即:

interface ProgressBarAware {
  void showProgressbar();
  void hideProgressbar();
}

并将ProgressBarAware引用传递给AsyncTask。在配置更改期间更新AsyncTask中的此引用非常重要,这意味着每次在配置更改后执行Activity.onCreate。


还有一个:不要在UI线程上的asynctask上使用get(),在调用'new SendRequest()。execute()。get();'。这会导致很多问题。它阻止Android使用的消息队列来处理负责响应用户点击,绘制小部件等的消息。几分钟后,这样的UI线程阻塞将在ANR(应用程序没有响应)中结束,系统将终止您的应用程序。

答案 1 :(得分:1)

Every activity of my class uses this AsyncTask class for communication

在AsyncTask中使用ProgressDialog

public class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{
    private ProgressDialog pDialog ;


    protected void onPreExecute() {
        m_logger.d("onPreExecute");
        pDialog = new ProgressDialog(m_applicationContext);
        pDialog.setCancelable(false);
        pDialog.show();
                ....
    }

    protected void onPostExecute(Intent result) 
    {
        if( null != pDialog)
            pDialog.dismiss();
        .....
    }

}

答案 2 :(得分:0)

您无需在ProgressDialog内部声明Activity(s)。相反,您可以像ProgressDialog一样在AsyncTask内创建public class SendRequestExample extends AsyncTask<ArrayList<String>, Void, String> { ProgressDialog pdialog = new ProgressDialog(yourcontexthere); .... @Override protected void onPreExecute() { super.onPreExecute(); pdialog.setCancelable(false); pdialog.setTitle("Please wait."); pdialog.setMessage("doing stuff..."); pdialog.show(); } @Override protected String doInBackground(String... params) { // doing stuff ... return result; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if(pdialog.isShowing()) pdialog.dismiss(); ... } }

{{1}}

希望这有帮助。

答案 3 :(得分:0)

在XML中隐藏ProgressBar,然后按照以下步骤操作。

public class MainActivity extends Activity {

ProgressBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bar = (ProgressBar) findViewById(R.id.progressBar1);
    new MyTask().execute();
}

class MyTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        bar.setVisibility(View.VISIBLE);
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        bar.setVisibility(View.GONE);
    }

}

}