【问题标题】:Progress Dialog impossible to show using one AsyncTask class使用一个 AsyncTask 类无法显示进度对话框
【发布时间】:2021-03-28 23:15:47
【问题描述】:

我试图在我的 MainActivity 中显示一个进度对话框,但这是不可能的: 这个类在 My MainActivity 中:

   class MyAsyncTask extends AsyncTask<Void, Integer, Void> {

        ProgressDialog progressDialog;
        private String titulo;
        private String mensaje;
        private MainActivity activity;
        public MyAsyncTask(MainActivity activity){
            this.activity = activity;

        }

        @Override
        protected Void doInBackground(Void... voids) {
            this.activity.createDirs();
            this.activity.copyAssets();
            return null;
        }

        @Override
        protected void onPreExecute() {

            this.progressDialog = new ProgressDialog(MainActivity.this);
            this.progressDialog.setTitle("test");
            this.progressDialog.setMessage("test message...");
            this.progressDialog.show();
            Toast.makeText(MainActivity.this, "OPA", Toast.LENGTH_LONG).show();
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progressDialog.dismiss();
        }

    }

这段代码在 My MainActivity.java 中:基本上,当用户按下一个按钮时,我正在创建一个对 MyAsyncTask 的引用并执行它。

btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(flag==1){
                    myAsyncTask = new MyAsyncTask(new MainActivity());
                    myAsyncTask.execute();
                    try {
                        myAsyncTask.get();
                    }catch (Exception e){

                    }

                    Intent intent = new Intent(MainActivity.this, Dashboardactivity.class);
                    startActivity(intent);
                    flag=0;
                }else{
                    Toast.makeText(MainActivity.this,"error", Toast.LENGTH_LONG).show();

                }
            }

类MyAsyncTask 的方法doInBackground() 的代码正在执行没有问题。我会感谢任何想法的家伙,非常感谢。

【问题讨论】:

  • AsyncTask 和 ProgressDialog 均已弃用;请考虑不使用它们。除此之外,摆脱myAsyncTask.get() 并将其后的代码移动到onPostExecute()。
  • doInBackground 函数需要多长时间?我使用Thread.sleep(5000) 测试了您的代码,它可以正常工作,只需尝试使用Thread.sleep() 检查问题是否出在doInBackGround 方法中
  • 嗨 @ShayKin 和 @CommonsWare 感谢您的 cmets.. doInBackground 大约需要 5 秒钟,这些函数正在将目录创建到 sdcard 并将我的所有文件从我的资产文件夹复制到一个文件夹..当它从 onPreExecute 完成 Toast 仅显示..
  • @ShayKin 我做到了myAsyncTask = new MyAsyncTask(new MainActivity()); myAsyncTask.execute(); try { Thread.sleep(8000); 但没有显示.. 很奇怪这是我的完整代码:pastebin.com/tEJsjebM 请检查它.. 非常感谢。
  • 我加了:imgur.com/a/lIsHaT5 但是没有出现..很奇怪

标签: java android android-studio progressdialog


【解决方案1】:

当您调用 myAsyncTask.get() 时,您的线程被阻止,这就是您的进度对话框未显示的原因,因此请删除 myAsyncTask.get() 并将这些行添加到 onPostExecute

Intent intent = new Intent(MainActivity.this, Dashboardactivity.class);
                    startActivity(intent);

完整代码:

  btnInit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(flag==1){
                        myAsyncTask = new MyAsyncTask(new MainActivity());
                        myAsyncTask.execute();
  
                        flag=0;
                    }else{
                        Toast.makeText(MainActivity.this,"error", Toast.LENGTH_LONG).show();
    
                    }
                }

在你的 asyncTask 上:

   class MyAsyncTask extends AsyncTask<Void, Integer, Void> {

        ProgressDialog progressDialog;
        private String titulo;
        private String mensaje;
        private MainActivity activity;
        public MyAsyncTask(MainActivity activity){
            this.activity = activity;

        }

        @Override
        protected Void doInBackground(Void... voids) {
            this.activity.createDirs();
            this.activity.copyAssets();
            return null;
        }

        @Override
        protected void onPreExecute() {

            this.progressDialog = new ProgressDialog(MainActivity.this);
            this.progressDialog.setTitle("test");
            this.progressDialog.setMessage("test message...");
            this.progressDialog.show();
            Toast.makeText(MainActivity.this, "OPA", Toast.LENGTH_LONG).show();
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progressDialog.dismiss();
            Intent intent = new Intent(MainActivity.this, Dashboardactivity.class);
            startActivity(intent);
        }

    }

【讨论】:

  • 嗨@Shay Kin 感谢您的回答。我按照你说的做了。现在 onPreExecute 的 Toast 显示得非常快,但进度对话框仍然没有出现。我不知道到底发生了什么。我也在使用 opencv 和 tesseract 库
  • 我们得出结论,doInBackground() 方法内部的两个方法 createDirs(); 和 copyAssets(); 导致了问题。 @Shay Kin 的代码完美运行。
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多