#java #android-asynctask
#java #android-asynctask
Вопрос:
package com.urban.map.services;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;
import com.urban.map.App;
import com.urban.map.database.Queries;
import com.urban.map.database.TestDB;
import org.richit.easiestsqllib.Column;
import org.richit.easiestsqllib.Datum;
import org.richit.easiestsqllib.EasiestDB;
import java.util.Date;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class LoadDataService extends AsyncTask<Void, Integer, String> {
private Context mContext;
private ProgressDialog pd;
public LoadDataService(Context context) {
super();
mContext = context;
}
@Override
protected void onPreExecute() {
pd = new ProgressDialog(mContext);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100);
pd.setMessage("Hello ");
pd.setTitle("ASSSSSSSs");
pd.show();
super.onPreExecute();
}
int current_percent = 0;
int count = 0;
@Override
protected String doInBackground(Void... voids) {
String time = String.valueOf(new Date().getTime()/1000L);
Queries q = App.getQueriesInstance(mContext);
q.insertTime();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://100rad.ru/api/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PostInterface service = retrofit.create(PostInterface.class);
Call<List<MapData>> call = service.getMap("full");
call.enqueue(new Callback<List<MapData>>() {
@Override
public void onResponse(Call<List<MapData>> call, Response<List<MapData>> response) {
List<MapData> newData = response.body();
String max = String.valueOf(newData.size());
Log.e("test","max " max);
for (int i = 0; i < newData.size(); i ) {
String auth_id = "368067266";
if (newData.get(i).getAuth().length() > 1) {
auth_id = newData.get(i).getAuth();
}
String store_id = newData.get(i).getStore_id();
String keywords = newData.get(i).getKey();
String telephone = newData.get(i).getTel();
String latitude = newData.get(i).getLat();
String longitude = newData.get(i).getLon();
String store_desc = newData.get(i).getStore_desc();
String store_name = newData.get(i).getStore_name();
String category_id = String.valueOf(newData.get(i).getCategory());
if (!category_id.equals("15")) {
ContentValues values = new ContentValues();
values.put("store_id", store_id);
values.put("keywords", keywords);
values.put("telephone", telephone);
values.put("latitude", latitude);
values.put("longitude", longitude);
values.put("store_desc", store_desc);
values.put("store_name", store_name);
values.put("category_id", category_id);
values.put("auth_id", auth_id);
q.insertStore(values);
values.clear();
List<Value> url = newData.get(i).getPhotos();
for (Value test : url) {
String data = test.getPhoto_url();
ContentValues pvalues = new ContentValues();
pvalues.put("store_id", store_id);
pvalues.put("photo_url", data);
q.insertPhoto(pvalues);
pvalues.clear();
}
}
count ;
current_percent = (100 * count / Integer.parseInt(max));
Log.e("test", "" current_percent);
publishProgress(current_percent);
}
}
@Override
public void onFailure(Call<List<MapData>> call, Throwable t) {
}
});
return "Sucess";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pd.setProgress(values[0]);
}
@Override
protected void onPostExecute(String result) {
SharedPreferences sharedPreferences = mContext.getSharedPreferences("App", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("firstLogin", false);
editor.apply();
if (pd != null amp;amp; pd.isShowing()) {
pd.dismiss();
}
}
}
Это мой код mysql-> sqlite, я хочу показывать ProgressDialog при загрузке данных, но по какой-то причине он не показывает его, хотя загрузка продолжается, и количество процентов попадает в журнал.
Я работал с этим методом не так давно, и я не понимаю, что я делаю не так. Мой метод вызывается из основного действия таким образом
новый LoadDataService(this).execute();
Моя конфигурация gradle:
compileSdkVersion 29
buildToolsVersion "29.0.2"
Комментарии:
1. Какого рода поведение при выполнении вы хотите? Похоже, что ваш
onResponse
обработчик вызываетpublishProgress
в цикле, переходя от 0 к 100, прежде чем система обновит пользовательский интерфейс. У вас может быть индикатор для «загрузки данных …» (с сервера) или для «анализа данных …» (заполненияQueries q
).2. @Brian Мне нужно создать диалоговое окно, в котором будет заполнена строка от 0 до 100
3. Сколько времени требуется для перехода от
Log.e("test","max " max);
кLog.e("test", "" 100);
по времени настенных часов?4. @Brian , весь процесс загрузки занимает около 10-15 секунд, в зависимости от количества загруженных объектов