При первом запуске приложения это загрузка данных с сервера, которая включает в себя текстовые и графические URL-адреса. Я хочу загрузить изображения с URL-адреса и сохранить их во внутреннем хранилище устройства Android (не хочу использовать библиотеку glide или picasso).
Мое приложение работает нормально, но загрузка данных с сервера занимает около 1 минуты из-за асинхронной задачи, которая вызывается для каждого URL-адреса.Может ли кто-нибудь помочь мне с эффективным способом сделать это.Я добавил свой код ниже
private void dataUpdation() {
if (!doesDatabaseExist(this, "localdb_final")) {
WebservicesCallingClass.insertValues(this, new ServerCallback() {
@Override
public void onSuccess(String result) {
addAllDataInDatabase(result, getApplicationContext());
progressBar.setVisibility(View.GONE);
setAdapters();
}
});
} else {
progressBar.setVisibility(View.GONE);
catArrayList=MyDBHandler.getInstance(context).getAllCategories();
customAdapter=new CategoryGridAdapter();
customAdapter.setItems(catArrayList);
}
}
Метод AddAllDataInDatabase
public void addAllDataInDatabase(String result, Context context) {
try {
JSONObject jsonRootObject = new JSONObject(result);
try {
JSONArray jsonCatArray = jsonRootObject.getJSONArray("category");
for (int i = 0; i < jsonCatArray.length(); i++) {
JSONObject obj = (JSONObject) jsonCatArray.get(i);
String path = null;
ConvertImage task = new ConvertImage();
MyTaskParams params = new MyTaskParams(obj.getString("category"), obj.getString("category_image"));
task.execute(params);
try {
path = task.get();
System.out.print("PATH" + path);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
CategoryDBPojo categoryDBPojo = new CategoryDBPojo(obj.getString("category"), obj.getInt("category_id"), path);
MyDBHandler.getInstance(context).addCategory(categoryDBPojo);
}
} catch (Exception e) {
Toast.makeText(context, "add all data" + e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
try {
JSONArray jsonSubcatArray = jsonRootObject.getJSONArray("subcategory");
for (
int i = 0; i < jsonSubcatArray.length(); i++) {
JSONObject obj = (JSONObject) jsonSubcatArray.get(i);
SubcategoryDBPojo subcategoryDBPojo = new SubcategoryDBPojo(obj.getString("subcategory"), obj.getInt("category_id"), obj.getInt("subcategory_id"));
MyDBHandler.getInstance(context).addSubCategory(subcategoryDBPojo);
}
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
try {
JSONArray jsonLinksArray = jsonRootObject.getJSONArray("link");
for (
int i = 0; i < jsonLinksArray.length(); i++) {
JSONObject obj = (JSONObject) jsonLinksArray.get(i);
String path = null;
LinksDBPojo linksDBPojo = null;
ConvertImage task = new ConvertImage();
if (StoredImage.loadImageFromStorage(getFilePath(), obj.getString("site_name")) == null) {
MyTaskParams params = new MyTaskParams(obj.getString("site_name"), obj.getString("image"));
task.execute(params);
try {
path = task.get();
System.out.print("PATH" + path);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
linksDBPojo = new LinksDBPojo(obj.getString("site_url"), obj.getString("site_name"), path, obj.getInt("subcategory_id"), obj.getInt("link_id"));
} else {
linksDBPojo = new LinksDBPojo(obj.getString("site_url"), obj.getString("site_name"), getFilePath(), obj.getInt("subcategory_id"), obj.getInt("link_id"));
}
MyDBHandler.getInstance(context).addLinks(linksDBPojo);
}
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
} catch (JSONException e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
Класс асинхронного преобразования ConverImage
public class ConvertImage extends AsyncTask<MyTaskParams, Void, String> {
HttpURLConnection connection;
String path;
protected String doInBackground(MyTaskParams... params) {
try {
String category = params[0].category;
URL url = new URL(params[0].url);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap1 = BitmapFactory.decodeStream(input);
path = StoredImage.saveToInternalStorage(bitmap1, getApplication(), category);
return path;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return path;
}
}
Из-за асинхронной задачи требуется много времени дляразбирать данные.