【问题标题】:onProgressUpdate is not being called androidonProgressUpdate 没有被称为 android
【发布时间】:2016-10-26 05:11:01
【问题描述】:

我在onCreate 中有这个GetAllUsers();,我有这个

private void GetAllUsers() {
  (new LoadingUsers(this)).execute();
} 

那我有这个

private class LoadingUsers extends AsyncTask < Void, Integer, String > {
  String TAG = getClass().getSimpleName();
  AlertDialog.Builder builderSingle;
  ArrayAdapter < String > arrayAdapter;@
  SuppressWarnings("unused")
  Context mContext;

  public LoadingUsers(Context context) {
    super();

    mContext = context;

  }

  protected void onPreExecute() {
    //            prgDialog.show();
    //            builderSingle = new
    Log.d(TAG + " PreExceute", "On pre Exceute......");
  }

  protected String doInBackground(Void...arg0) {

    Log.d(TAG + " DoINBackGround", "On doInBackground...");
    return null;
  }

  protected void onProgressUpdate(Integer...a) {
    super.onProgressUpdate(a);
    Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]);


  }

  protected void onPostExecute(String result) {
    //            prgDialog.hide();
    Log.d(TAG + " onPostExecute", "" + result);


    MainActivity.this.pd.dismiss();
  }
}

我想在protected void onProgressUpdate(Integer... a) { 中添加一个builderSingle = new AlertDialog.Builder(MainActivity.this);,它有一个AsyncHttpClient client = new AsyncHttpClient();,但不幸的是onProgressUpdate 根本没有被调用。我知道这一点,因为日志没有显示。除了onProgressUpdate 我也有

@
Override
protected void onDestroy() {
  super.onDestroy();
  Log.i(TAG, "On Destroy .....");
}

@
Override
protected void onPause() {
  super.onPause();
  Log.i(TAG, "On Pause .....");
}

@
Override
protected void onRestart() {
  super.onRestart();
  Log.i(TAG, "On Restart .....");
}

@
Override
protected void onResume() {
  super.onResume();
  Log.i(TAG, "On Resume .....");
}

@
Override
protected void onStart() {
  super.onStart();
  Log.i(TAG, "On Start .....");
}

@
Override
protected void onStop() {
  super.onStop();
  Log.i(TAG, "On Stop .....");
}

OnStartOnResume 也在记录中。

为什么没有调用 onProgressUpdate? 如何正确调用 onProgressUpdated?

Update

onPostExecute 也被调用,onProgressUpdate 不是

【问题讨论】:

  • 我认为您需要在 doInBackGround() 中调用 publishProgress?
  • 你在哪里调用 publishProgress?
  • @Raghavendra 是问题还是答案?因为从我在 SO 中找到的示例中,他们不会在 doInBackGround 上调用它
  • @BrownmanRevival 不,您需要调用 publishProgress 来获取 onProgressUpdate 的更新。
  • @BrownmanRevival 使用 publishProgress(Progress...) 发布一个或多个进度单位。这些值发布在 UI 线程的 onProgressUpdate(Progress...) 中。它是一个答案:)

标签: java android async-onprogressupdate


【解决方案1】:

每次从doInBackground(在后台线程上)调用publishProgress时,都会在主线程上调用onProgressUpdate。如果您选择使用此功能,则为您提供方便。如果您的任务涉及某种循环,这主要是有用的,在这种情况下,您可以在每次迭代时调用publishProgress。如果您的任务只是调用一些其他代码,并且所有处理都发生在您无法控制的地方,那么publishProgress/onProgressUpdate 机制对您没有用处。在这种情况下,您可能决定在开始任务之前显示不确定的进度条,然后在完成后隐藏不确定的进度条。

【讨论】:

  • 实际上这就是我正在做的显示对话框和隐藏onPostExecute 但它根本没有显示。这就是为什么我认为问题出在onProgressUpdate
  • 任务是否结束得太快以至于您没有看到对话框?
  • 有没有办法检查对话框是否出现?我想我没有出现,因为在 UI 开始显示活动页面之前有很长的停顿。活动页面表示当前活动的内容。
  • 让您的任务花费更长的时间。出于测试目的,您可以使用try { Thread.sleep(1000); } catch(InterruptedException x) { }
【解决方案2】:

应该很简单

private class LoadingUsers extends AsyncTask< Void, Integer, String > {
    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = ProgressDialog.show(getContext(), null, "Loading users...", false);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        dialog.setProgress(values[0]);
    }

    @Override
    protected String doInBackground(Void... params) {
        // Doing something in loop
        int max = 1024;
        for (int i = 0; i < max; i++) {
            int percentageCompleted = i*100/max;
            publishProgress(percentageCompleted);
        }
        return "";
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        dialog.dismiss();
    }
}

如果你不明白这段代码是什么,请告诉我。

【讨论】:

    【解决方案3】:

    您的代码可能需要以下功能:

    @Override                                                          
    protected void onProgressUpdate(Integer a) { 
        super.onProgressUpdate(a);
    }
    

    【讨论】:

      【解决方案4】:

      重写函数而不是仅仅复制过去, 使用关键字@Override

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多