Как можно использовать обновление 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...) не будет вызываться, если задача была отменена.