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

Pis*_*ean 3 android android-layout android-progressbar android-asynctask android-activity

我创建了一个单独的类,它扩展了我在整个应用程序中用于通信的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);
         }
      }
  }
Run Code Online (Sandbox Code Playgroud)

和AsyncTask类是:

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

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

              // doing communication 
              ...

              return result;
          }      
  }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

mar*_*inj 5

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

SendRequestExample.onPreExecute()
Run Code Online (Sandbox Code Playgroud)

并将其隐藏在:

SendRequestExample.onPostExecute()
Run Code Online (Sandbox Code Playgroud)

方法.

如果您的SendRequestExample对于许多活动是通用的,那么您可以使MyActivity实现接口,即:

interface ProgressBarAware {
  void showProgressbar();
  void hideProgressbar();
}
Run Code Online (Sandbox Code Playgroud)

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


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