【问题标题】:Android studio progress dialog not showing progress?Android Studio 进度对话框未显示进度?
【发布时间】:2020-04-01 19:19:04
【问题描述】:

我有一些代码(最后包含完整的方法),其中包括一个进度对话框。 问题是进度对话框没有显示任何进度(它没有从 0 移动到 100),它保持为零,没有移动,直到代码完成然后消失。所以它在正确的时间出现并在正确的时间被解雇,但它没有显示两者之间的进度。

这是我尝试增加对话框的部分。 intProgress 变量正在工作,我可以在日志中看到它从 0 递增到 100,那么为什么不会在进度对话框中显示呢?

                for(Animal animal : lstAnimals) {
                    i = i + 1;
                    animal.addToSqlLite(strTableName, animal, sqLiteDatabase);
                    int intProgress = (int) (((double) (i) / (double) lstAnimals.size()) * 100);
                    Log.d(TAG, "vvvv: " + "i = " + i + " total = " + lstAnimals.size() + " prog = " + intProgress);
                    progressDialog.setProgress(intProgress);
                }

这里有完整的方法:


    // fetches data from the server and copies it across to the sqlite database
public void fetchDataFromServerAndAddToSqlLite(ProgressBar progressBar, String strTableName, SQLiteDatabase sqLiteDatabase, Context context) {

//        progressBar.setVisibility(View.VISIBLE);
        ProgressDialog progressDialog = new ProgressDialog(context);
        progressDialog.setTitle("Wildgoosechase");
        progressDialog.setMessage("Downloading Animals...");
        progressDialog.setProgressStyle(progressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://xxxxxxxxxxxx.co.za/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        wildgoosechaseAPI myWildGooseChaseApi = retrofit.create(wildgoosechaseAPI.class);

        retrofit2.Call<List<Animal>> call = myWildGooseChaseApi.getAnimals();

        call.enqueue(new Callback<List<Animal>>() {
            @Override
            public void onResponse(Call<List<Animal>> call, Response<List<Animal>> response) {

                if(!response.isSuccessful()){
//                    progressBar.setVisibility(View.GONE);
                    progressDialog.dismiss();
                }

                List<Animal> lstAnimals = response.body();
                int i = 0;

                for(Animal animal : lstAnimals) {
                    i = i + 1;
                    animal.addToSqlLite(strTableName, animal, sqLiteDatabase);
                    int intProgress = (int) (((double) (i) / (double) lstAnimals.size()) * 100);
                    Log.d(TAG, "vvvv: " + "i = " + i + " total = " + lstAnimals.size() + " prog = " + intProgress);
                    progressDialog.setProgress(intProgress);
                }

//                progressBar.setVisibility(View.GONE);
                progressDialog.dismiss();


            }

            @Override
            public void onFailure(Call<List<Animal>> call, Throwable t) {
//                progressBar.setVisibility(View.GONE);
                progressDialog.dismiss();

            }
        });


    }

【问题讨论】:

    标签: android-studio progressdialog


    【解决方案1】:

    我认为缺少线程//线程用于更改进度值

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                setProgressValue(progress + 1);
            }
        });
        thread.start();
    

    【讨论】:

    • 顺便还有第三方库github.com/daimajia/NumberProgressBar
    • 我试过了,没用。我将它放在我当前尝试更新进度对话框的方法中。对吗?
    • 这个解决方案是完全错误的。永远不要从非 UI 线程更新 UI。有关使用 UI 线程的正确方法,请参阅我的答案。
    • 谢谢大卫,我同意您的解决方案看起来合乎逻辑,但是,作为初学者,我不知道如何实现它。我确实回复了您的答案,要求提供更多建议。谢谢
    【解决方案2】:

    为什么不调用一个函数来做一件事

    List<XXX> list;
    
    public void fetchData() {
        //set start progressDialog
    
        fetchDataFromServer();
        saveDataToSQLite();
    }
    
    
    fetchDataFromServer() {
      ... 
      // Save response from server to list
    }
    
    
    public void saveDataToSQLite() {
      ...
      // Finish set progressDialog dimiss
    }
    

    【讨论】:

      【解决方案3】:

      一个可能的问题是您正在从非 UI 线程更新进度条。 您可以尝试将 setProgress 调用移动到 UI 线程中:

      (假设您的方法在活动中)

      YourActivity.this.runOnUiThread(new Runnable(){
         public void run(){
            progressDialog.setProgress(intProgress);
         }
      });
      

      【讨论】:

      • 您好,我认为这与线程有关,我必须承认我是一个相对初学者并且不完全了解何时应该使用不同的线程。不幸的是,我的代码在一个单独的类中,但我确实在上下文变量中传递了活动。有什么办法可以使用这个变量在 ui 线程上运行?
      猜你喜欢
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多