【问题标题】:Progressbar not working inside AsyncTask进度条在 AsyncTask 中不起作用
【发布时间】:2014-01-23 19:06:11
【问题描述】:

我正在使用AsyncTask 从服务器下载大量数据,我的 AsyncTask 工作正常,所以我添加了一个进度条以使一切变得漂亮,但问题是当它的运行进度条在中途冻结时,我使用进度对话框,它在中途冻结也是一样的,

private class downloadChannelsfromserver extends
        AsyncTask<String, Void, String> {

     ProgressDialog progressDialog;

    @Override
    protected String doInBackground(String... url) {
        String data = "";

        try {
            // Fetching the data from web service
            data = getLinksfromServer(url[0]);
        } catch (Exception e) {
            Log.d("Background Task", e.toString());
        }
        return data;
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
         progressDialog= ProgressDialog.show(Settings.this, "Synchronicing","Synchronicing", true);


    }



    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        JSONObject json;
        try {
            json = new JSONObject(result);
            db.deleteAll();
            final JSONArray jsonArray = json.getJSONArray("XXXX");

            for (int i = 0; i < jsonArray.length(); i++) {
                                ///use for insert datainto database
            }
            finish();

            progressDialog.dismiss();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            Log.e("settings", "", e);
            progressDialog.dismiss();

        }
    }

谁能告诉我为什么会这样,请

【问题讨论】:

  • 你在哪里更新进度条的状态?
  • 类downloadChannelsfromserver,是SettingsActivity的内部类吗?
  • 在你调用活动finish()的finish之前尝试关闭你的对话框; progressDialog.dismiss();交换它们?
  • 这只是一个简单的进度对话框,是的,这是一个内部类或设置活动,我已经交换了它们但仍然冻结
  • 除非您在初始化和更新progressBar的地方添加代码,否则恐怕没有人能够准确地帮助您。

标签: android android-asynctask progressdialog


【解决方案1】:

关注此代码

private ProgressDialog pdialog = null;

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

   if(pdialog ==null){
     //display progress dialog like this
     pdialog = new ProgressDialog(context);
     pdialog.setCancelable(false);
     pdialog.setMessage("Please Wait...");
     pdialog.show();
   }
}



@Override
   protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        //dismiss progress dialog like this

        if(pdialog!=null){
             pdialog.dismiss();
             pdialog = null;
        }
    }

【讨论】:

    【解决方案2】:

    进度条卡住的原因是我的JSON 解码,因为onPostExecute 属于UI 线程,解码json 结果需要一些时间。所以它将冻结 UI 直到 JSON 解码所以将解码部分移动到 doInBackground 将解决 UI 冻结问题,因为 doInBackground 属于后台线程

    【讨论】:

      【解决方案3】:

      请像这样编辑您的代码:

      private class downloadChannelsfromserver extends
          AsyncTask<String, Void, String> {
      
       ProgressDialog progressDialog;
      
      public downloadChannelsfromserver()
      {
          progressDialog = new ProgressDialog(Settings.this);
          progressDialog.setTitle("Synchronicing ...");
          progressDialog.setCancelable(false);
          progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
      }
      
      @Override
      protected String doInBackground(String... url) {
          String data = "";
      
          try {
              // Fetching the data from web service
              data = getLinksfromServer(url[0]);
          } catch (Exception e) {
              Log.d("Background Task", e.toString());
          }
          return data;
      }
      
      @Override
      protected void onPreExecute() {
          // TODO Auto-generated method stub
          //super.onPreExecute();
        progressDialog.show();
      
      }
      
      
      
      @Override
      protected void onPostExecute(String result) {
          // TODO Auto-generated method stub
          super.onPostExecute(result);
          JSONObject json;
          try {
              json = new JSONObject(result);
              db.deleteAll();
              final JSONArray jsonArray = json.getJSONArray("XXXX");
      
              for (int i = 0; i < jsonArray.length(); i++) {
                                  ///use for insert datainto database
              }
              finish();
          } catch (JSONException e) {
              // TODO Auto-generated catch block
              Log.e("settings", "", e);
          }
          finally
          {
           progressDialog.dismiss();
          }
      }
      

      我希望这会有所帮助。

      【讨论】:

      • 当您的进度对话框被冻结时,请分享您的 Logcat 日志,谢谢。
      【解决方案4】:

      只需使用此代码:

      runOnUiThread(object : Runnable {
          override fun run() {
              pausingDialog =
                  SweetAlertDialog(this@History_Activity, SweetAlertDialog.PROGRESS_TYPE)
              pausingDialog!!.titleText = "Please wait...."
              pausingDialog!!.setCancelable(false)
              pausingDialog!!.show()
          }
      })
      
      runOnUiThread(object : Runnable {
          override fun run() {
          }
      })
      

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多