Как можно использовать обновление UI Thread

У меня есть такой же товар, я хочу отправить локальную базу данных в ApiService, но при отправке я также хочу обновить сообщение ProgressBar. Я попробовал код ниже, но он просто показывает, когда завершается вся обработка.

  ProgressDialog progress= new ProgressDialog(this);        
  progress.setTitle(getResources().getString(R.string.progress_exporting));
  progress.setMessage("0/0");

при нажатии на кнопку я вызываю ниже метод

  public void Export() {

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            findViewById(R.id.btnExportOnlineWithStocktaking).setEnabled(false);
            progress.show();
        }
    });

    UpdateUI(send, total);

    try {

        switch (_stocktakingType) {
         case Division: {
                switch (_onlineExportType) {
                    case Item: {
                        isExport = ExportDivisionStocktakingItems(stocktakingId);
                    }
                    break;
                }
        } catch (Exception ex) {
    }

  }

// ExportDivisionStocktaking метод

 public boolean ExportCustomStocktakingItems(int stocktakingId) {
     result = Boolean.parseBoolean(SendCustomStocktakingItems(stocktakingId,countResults).responseString);
}

Мой метод обратного вызова

public ResponseModel SendCustomStocktakingItems(int selectedDivision, List<ExtensionServiceStocktakingItem> countResults) throws ExecutionException, InterruptedException {

    return new SendCustomStocktakingItemsService(flag -> true).execute(String.valueOf(selectedDivision), countResults.toString()).get();

}

// метод AsyncTask

 public class SendDivisionStocktakingItemsService extends AsyncTask<String, Void, ResponseModel> {

    public AsyncResponseSendDivisionStocktakingItems delegate = null;

    public SendDivisionStocktakingItemsService(AsyncResponseSendDivisionStocktakingItems delegate) {
        this.delegate = delegate;
    }

    @Override
    protected ResponseModel doInBackground(String... parameters) {


        RequestHandler requestHandler = new RequestHandler();

        JSONObject params = new JSONObject();
        try {
            params.put("stocktakingItems", parameters[1]);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        ResponseModel responseModel = requestHandler.getRequestPostString(UHFApplication.getInstance().apiUrl
                        + "/api/MobileService/SendDivisionStocktakingItemsPost?stocktakingID="
                        + parameters[0],
                parameters[1]);
        return responseModel;

    }

    @Override
    protected void onPreExecute() {
        UpdateUI(send,total);
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(ResponseModel responseModel) {

        super.onPostExecute(responseModel);

        if (HttpURLConnection.HTTP_OK == responseModel.httpStatus) {

            delegate.processFinish(true);


        } else {
            delegate.processFinish(false);
        }
    }

}

//UICalled метод

 public void UpdateUI(int send, int total) {
    runOnUiThread(() -> {
        progress.setMessage(send + "/" + total);
        Log.d("Send Data : ", send + "/" + total);

        if (send == total) {
            progress.dismiss();
            Toast.makeText(getApplicationContext(), "Succsess", Toast.LENGTH_SHORT).show();
        }
    });
}

//Обновить

// Хорошо, у меня есть простой пример, как я могу использовать. Ниже кода, когда я нажимаю кнопку, я хочу сначала открыть прогресс, а затем цикл for и обновить сообщение progres. Я пытаюсь, но не работает.

Сначала работает цикл For, а после этого открывается прогрес.

 public void ExportTry(){
    UpdateUI(send,total);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            btnExport.setEnabled(false);
            progress.show();
        }
    });


    for(int i=0;i<1000000;i++){
        UpdateUI(i,1000000);
    }
}

1 ответ

Вам не хватает части AsyncTask что позволит вам показать сообщения о прогрессе в то время как doInBackground бежит. Взгляни на onProgressUpdate а также publishProgress на той же странице.

publishProgress

void publishProgress (Прогресс... значения)

Этот метод может быть вызван из doInBackground(Params...) для публикации обновлений в потоке пользовательского интерфейса, пока фоновые вычисления еще выполняются. Каждый вызов этого метода будет инициировать выполнение onProgressUpdate(Progress...) в потоке пользовательского интерфейса. onProgressUpdate(Progress...) не будет вызываться, если задача была отменена.

Другие вопросы по тегам