【问题标题】:ProgressBar not showing up during a AsyncTaskProgressBar 在 AsyncTask 期间未显示
【发布时间】:2013-07-24 15:34:47
【问题描述】:

我正在尝试在后台创建一个简单的任务,并在完成时显示一个进度条。

这是主要(也是唯一)活动的代码:

public class Login extends Activity {

    public static ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
        progressDialog = new ProgressDialog(activity); 
        progressDialog.setMessage("Sending data...");
        progressDialog.setCancelable(false);
        (...)
             // In some onClick Eevent..
             JSONObject result = new Urltasks().execute(...).get();
        (...)

    }
}

这是活动的代码:

class Urltasks extends AsyncTask<String, Integer, JSONObject>{

    protected void onPreExecute()  {
        System.out.println("Inicia onPreExecute");
        Login.progressDialog.show();
    }

    protected void onPostExecute(String result) {
        Login.progressDialog.dismiss();
    }

    protected JSONObject doInBackground(String... arg0) {
             // Some work being done. I do not use Login.progressDialog here
    }
}

使用此代码,ProgressDialog 会在任务结束时显示,并且不会关闭。

【问题讨论】:

    标签: java android android-asynctask progress-bar


    【解决方案1】:

    问题就在这里:

    JSONObject result = new Urltasks().execute(...).get();
    

    AsyncTask 上调用 get() 会阻塞当前线程,即您的 UI 线程,直到执行 AsyncTask。因此进度对话框无法运行。删除get()

    要获取 AsyncTask 的结果,您可以例如将侦听器回调传递给异步任务,当结果可用时收到通知:

    class YourAsyncTask extends AsyncTask<ParamType, ProgressType, ResultType> {
    
      private YourResultListener mListener;
    
      interface YourResultListener {
        void onResultAvailable(ResultType result);
      }
    
      YourAsyncTask(YourResultListener listener) {
        mListener = listener;
      }
    
      @Override protected ResultType doInBackground(ParamType... params) {
        //...
      }
    
      @Override protected void onPostExecute(ResultType result) {
        mListener.onResultAvailable(result);
      }
    }
    

    你可以像这样使用它:

    mProgressDialog.show();
    new YourAsyncTask(new YourResultListener() {
        @Override void onResultAvailable(ResultType result) {
          mProgressDialog.dismiss();
          // use result
        }).execute(params);
    

    我个人喜欢将进度对话框等用户界面元素与异步任务分离。

    【讨论】:

      【解决方案2】:

      不要将您的进度对话框放在您的登录课程中。将其保存在异步任务中

      这就是你显示对话框的方式

           progressDialog = ProgressDialog.show(yourActivityHERE.this, "",
          "Loading... please wait.");
      

      为你编辑了这个:

      class Urls extends AsyncTask<String, Integer, JSONObject>{
      
      ProgressDialog progressDialog;
      
      protected void onPreExecute()  {
      
           progressDialog = ProgressDialog.show(yourActivityHERE.this, "",
          "Loading... please wait.");
      
      }
      
      protected void onPostExecute(String result) {
         progressDialog.dismiss();
      }
      
      protected JSONObject doInBackground(String... arg0) {
               // Some work being done. I do not use Login.progressDialog here
      }
      }
      

      【讨论】:

      • 我应该什么时候构建它?在'OnPreExcute,对吗?使用哪个上下文?
      • 是 OnPreExcute,而且上下文是您当前所处的活动。我已经为您编辑了答案
      【解决方案3】:

      在发送调用类上下文的 Urltasks 中创建构造函数。 然后使用该上下文在您的 Urltasks 的 preExecute 中创建进度对话框

      class Urltasks extends AsyncTask<String, Integer, JSONObject>{
      Context mContext;
      public static ProgressDialog progressDialog;
      
      public UrlTasks(Context c){
         mContext=c;
      }
      protected void onPreExecute()  {
          progressDialog = new ProgressDialog(mContext); 
          progressDialog.setMessage("Sending data...");
          progressDialog.setCancelable(false);
          progressDialog.show();
      }
      
      protected void onPostExecute(String result) {
          progressDialog.dismiss();
      }
      
      protected JSONObject doInBackground(String... arg0) {
               // Do your work here
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多