Эффективный способ анализа URL-адресов изображений (с сервера) и их хранения во внутренней памяти? - PullRequest
1 голос
/ 04 апреля 2019

При первом запуске приложения это загрузка данных с сервера, которая включает в себя текстовые и графические 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;
    }
}

Из-за асинхронной задачи требуется много времени дляразбирать данные.

1 Ответ

1 голос
/ 04 апреля 2019

Несколько вещей, на которые следует обратить внимание:

  1. Всегда ли изображение одинаково и всегда / регулярно показывается и компонент приложения;свяжите его как ресурс или загрузите как файл расширения apk при первой установке.

  2. Изображение всегда одинаковое и всегда / регулярно показывается;загрузите его в папку галереи на устройстве.

  3. Является ли изображение временным, но, вероятно, будет повторяться и показываться снова в течение нескольких дней и т. д .;используйте кэширование изображений с Glide или Picasso .Glide - рекомендуемый метод загрузки изображений Google.

  4. Если изображение регулярно обновляется и подключено к какому-либо веб-сервису (т.е. имеет большой размер, более высокое разрешение);уменьшите размеры, разрешение и формат изображения, чтобы настроить изображение на стороне сервера, чтобы оно было готово для мобильной загрузки.Прочитайте Уменьшение размеров загружаемого изображения , из документации Google по Android и Автоматическая оптимизация изображения .

Надеюсь, это поможет.

Помните всегда будет задержка загрузки, связанная с сетью, из-за изменяющейся скорости и других аппаратных факторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...