Как обновить Progressbar в Android при загрузке и вставке данных JSON в SQLite? - PullRequest
0 голосов
/ 29 мая 2019

Фоновая или потоковая операция загрузки и вставки данных JSON в базу данных работает нормально, но я также хочу обновить мой ProgressBar, когда операция вставки данных продолжает обновляться.Моя проблема в том, что он начинается с нулевого процента и закрывается, когда вся операция завершена без какого-либо обновления в процентном значении.

Downloading view seems like this

Фрагмент синхронизации:

String value; //defined globally

private class JsonParse extends AsyncTask<String, String, String> {

    Context mcontext;
    private ProgressDialog progressDialog;

    public JsonParse(Context context) {
        this.mcontext = context;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
    }

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

        progressDialog = new ProgressDialog(mcontext);

        progressDialog.setTitle("Downloading"); // Setting Title
        progressDialog.setMessage("Please wait"); // Setting Message
        progressDialog.setIndeterminate(false);
        progressDialog.setMax(100);
        progressDialog.setCancelable(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, mcontext.getString(R.string.cancel_btn), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {

        String choice = params[0];
        final String url = BASE_URL + "" + VERSION + "" + METHOD + "";

        StringRequest request = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        Log.i("response", url + "response:" + response);

                        try {
                            JSONObject object = new JSONObject(response);
                            JSONArray jsonArray = object.getJSONArray(METHOD + "");

                            long counter = 0;
                            int size = jsonArray.length();

                            for (int i = 0; i <= size; i++) {

                                final JSONObject jsonObject = jsonArray.getJSONObject(i);

                                counter++;
                                int percent = (int) ((counter * 100) / size);
                                value = percent + "";

                                onProgressUpdate(value);

                                Log.i("view_", "size: " + size + " " + "counter: " + counter + " " + "percent: " + percent + "%");

                                switch (choice) {

                                    case "deaths":

                                        String id_d = jsonObject.getString("id");
                                        String family_id = jsonObject.getString("family_id");
                                        String death_one_year = jsonObject.getString("death_one_year");
                                        String no_of_deaths = jsonObject.getString("no_of_death");
                                        String cause = jsonObject.getString("cause");
                                        String cause_other = jsonObject.getString("cause_other");
                                        String ward_id_d = jsonObject.getString("ward_id");
                                        String has_error_d = jsonObject.getString("has_error");
                                        String updated_by_d = jsonObject.getString("updated_by");
                                        String updated_at_d = jsonObject.getString("updated_at");
                                        String created_at = jsonObject.getString("created_at");
                                        String uuid_d = jsonObject.getString("uuid");

                                        dbHelper.SyncDeath(Integer.parseInt(id_d), family_id, death_one_year, no_of_deaths, cause, cause_other,
                                                ward_id_d, has_error_d, updated_by_d, updated_at_d, created_at, uuid_d);

                                        death_txt.setTextColor(getResources().getColor(R.color.colorPrimary));
                                        death_txt.setText(R.string.synced);

                                        break;
                                }
                            }
                            return;

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        progressDialog.dismiss();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                Toast.makeText(getContext(), "Server Error, Please Try Again!!", Toast.LENGTH_SHORT).show();
            }
        });

        requestQueue.add(request);

        publishProgress(value);

        Log.i("view_percent_value", value); // Getting null value

        /*for (int i = 0; i <= 100; i++){
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            publishProgress(String.valueOf(i));
        }*/

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {

        progressDialog.setProgress(Integer.parseInt(values[0]));
        value = values[0]; // Tried to update this "value" i.e. set globally but can't update

        Log.i("view_values", values[0] + "");
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {

    }
}

Код с комментариями:

 /*for (int i = 0; i <= 100; i++){
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            publishProgress(String.valueOf(i));
        }*/

помогает мне обновить ProgressBar, но он не обновляется в реальном времени.В моем случае параметр передается в publishprogress ();то есть "значение", которое определено глобально, не получает обновленное значение из цикла.Как я полагаю, это может быть случай использования цикла for внутри try-catch, но я не могу найти способ передать это значение в publishprogress ();method.

Просмотр журнала:

Log.i("view_", "size: " + size + " " + "counter: " + counter + " " + "percent: " + percent + "%");

обновляет процентное значение в режиме реального времени.Вот так: Log view of updating percentage value

Пожалуйста, помогите мне разобраться с этой проблемой.Я застрял с этой проблемой пару недель.Заранее спасибо !!

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Первый , согласно андроид документам никогда не звоните onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) вручную.(вы звоните onProgressUpdate в doInBackground вручную)

Второй , переместите publishProgress(value); в цикл for в блоке try.

0 голосов
/ 29 мая 2019

Попытка установки значения вашего прогресса в функции onProgressUpdate().

Перейдите по этой ссылке для справки: андроид как работать с асинхронными задачами progressdialog

...