【问题标题】:android - ProgressDialog shows up too late when the task is finishedandroid - 任务完成时,ProgressDialog 显示得太晚
【发布时间】:2016-08-24 18:52:26
【问题描述】:

我正在尝试从数据库中获取一些数据。 我希望在从数据库加载数据的同时显示一个progressDialog。

我正在使用扩展 AsyncTask 的 BgClass 类。 在 preExecute 我显示对话框,在 postExecute 我关闭对话框。

但在从数据库加载数据后,对话框仍然会显示,并且会被关闭,即甚至不显示。

public class BgClass extends AsyncTask<parameters>{

ProgressDialog dialog;

BgClass(Context context){

    dialog = new ProgressDialog(context);
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    dialog.setMessage("Loading ...");
    dialog.setIndeterminate(true);
    dialog.setCanceledOnTouchOutside(false);
}

@Override
protected doInBackground(parameter) {

    //fetching entries from DB
}

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

}

@Override
protected void onPostExecute(parameter) {
    super.onPostExecute(ratingBackendlessCollection);
    dialog.dismiss();
}

}

ps - 我已经正确调用了构造函数,并且也使用相同的对象执行。

这是callingActivity或者调用BgClass对象的java文件的代码(去掉了一些不相关的代码);

public class SeeComments extends AppCompatActivity{

//variable initialisation

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.see_comments);

    list = new ArrayList<>();

    btnLoadMore = new Button(this);
    btnLoadMore.setText("Load More");

    lv_sc_cmnt.addFooterView(btnLoadMore);

    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);

    lv_sc_cmnt.setAdapter(adapter);

    context = this;

    btnLoadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addMoreToList();
        }
    });

    ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);
}

private void addMoreToList() {

    offset+=pageSize;

    if (list.size()<totalReviews) {

        BgClass bgClass = new BgClass(resAll,pageSize,offset,this);

        try {
            resAll = bgClass.execute(resAll, null, null).get();
        }catch (InterruptedException e){
            Toast.makeText(this,e.getMessage(),Toast.LENGTH_LONG).show();
        }catch (ExecutionException e){
            Toast.makeText(this,e.getMessage(),Toast.LENGTH_LONG).show();
        }

       // add loaded data to list

        adapter.notifyDataSetChanged();
    } else {
        Toast.makeText(this, "All reviews loaded", Toast.LENGTH_LONG).show();
    }
}

}

【问题讨论】:

  • 请给我们您调用此 AsyncTask 的活动来帮助您。
  • 如果您的任务不是一个长时间的操作,那么您将看不到您的ProgressDialog,或者如果您正在测试的设备更新更快,它将更快地完成任务。
  • 我已经添加了调用这个 AsyncTask 的活动。
  • 网速慢时,需要时间,但仍然没有出现对话框。

标签: android


【解决方案1】:

您还必须覆盖 onProgressUpdate:

 @Override
 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 setProgressPercent(int value) {
    dialog.setMessage("Loaded value " + value);
 }

参考:Android Dev site

【讨论】:

  • 我看不出这与 OP 问题有什么关系
【解决方案2】:

将进度对话框移至 onPreExecute

并使用 getActivity() 作为上下文

@Override
protected void onPreExecute() {
    dialog = new ProgressDialog(getActivity());
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    dialog.setMessage("Loading ...");
    dialog.setIndeterminate(true);
    dialog.setCanceledOnTouchOutside(false);
    dialog.show();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多