Android Диалог прогресса студии не показывает прогресс? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть некоторый код (полный метод включен в конце), который включает в себя диалог Progress. Проблема в том, что в диалоговом окне Progress не отображается никакого прогресса (он не перемещается от 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();

            }
        });


    }

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Почему бы не вызвать одну функцию, чтобы сделать одну вещь

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
}
0 голосов
/ 10 апреля 2020

Одной из возможных проблем может быть то, что вы обновляете индикатор выполнения из потока, не являющегося пользовательским интерфейсом. Вы можете попытаться переместить вызов setProgress в поток пользовательского интерфейса:

(при условии, что ваши методы находятся внутри действия)

YourActivity.this.runOnUiThread(new Runnable(){
   public void run(){
      progressDialog.setProgress(intProgress);
   }
});
0 голосов
/ 06 апреля 2020

Я думаю, что отсутствует thraed // поток используется для изменения значения прогресса

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