修复进度对话框在下载完成后显示

时间:2019-01-22 16:54:46

标签: android

我有一个用文章填充的ListView。当用户长时间单击文章时,我想下载其摘要并将其显示给用户。我在AsyncTask(NOT doInBackground ...)中有一个函数负责下载。在下载过程中,我想显示一个ProgressDialog。由于下载是在主线程上进行的,因此当我长按一下文章时会有一个延迟,并且在下载完成后ProgressDialog将显示。在下载过程中如何显示?

我尝试了这些方法,但是由于我是Android开发的初学者,所以我不太了解。该应用程序在下载时冻结,并在完成后显示对话框。

ProgressDialog shows up after thread is done display progressdialog while listview is loading

HomeActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);


    trendingList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

            try {
            ...
            } catch (Exception e) {

                String link = homeLinks.get(position);
            //TASK TO DOWNLOAD SUMMARIES FROM ASYNCTASK
                task.downloadSummary(link);
                adapter.notifyDataSetChanged();

            }
            return true;
        }
    });

背景类

public class  BackgroundTask extends AsyncTask<String, Void, String> {

ProgressDialog progress = new ProgressDialog(HomeActivity.this);

 //SHOW DIALOG AND THEN DOWNLOAD SUMMARIES
    public void downloadSummary(String address){

        progress.setMessage("Downloaded summary ");
        progress.show();
        ...

谢谢。

1 个答案:

答案 0 :(得分:0)

初始化AsyncTask时,您必须分配此线程的3个相关方法,onPreExecute将分配您的ProgressDialog,InBackground将您要执行的工作分配给该对象,onPostExecute将您要执行的工作分配给您的结果,然后关闭progressDialog

它一直这样住

public class  BackgroundTask extends AsyncTask<String, Void, String> {

ProgressDialog progress = new ProgressDialog(HomeActivity.this);


    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    progress.setMessage("Downloaded summary ");
    progress.show();
    }

    @Override
        protected void doInBackground(String... strings) {
    //Ação do Trabalho
    }

    @Override
        protected void onPostExecute(String result) {
        progress.dismiss();
        Log.e("Work", "Result "+result);
    }
}

这是强制性的,当它被AsysnTask不得不使用时,google后台方法不喜欢这种用法。相反,如果这是一项快速工作,请使用以run调用的线程