Как не сделать задержку при загрузке изображения? - PullRequest
0 голосов
/ 18 ноября 2018

Я загружаю изображения с сервера в программе recyclerView и параллельно загружаю и это изображение.Что я на самом деле хочу сделать, так это до тех пор, пока изображение не загрузится, пока не отобразится размытый или темный непрозрачный предварительный просмотр изображения с индикатором выполнения на нем. Чтобы загрузить изображение, которое я использую glide, и для загрузки я использую Okhttp

Чтобы загрузить изображение в поле зрения: -

Glide.with(cont).load(modal.get(position).getMassege()).apply(requestOptions).listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, com.bumptech.glide.request.target.Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, com.bumptech.glide.request.target.Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {

                        if(modal.get(position).getProgressPercentage()==0) {
                            new Thread(new Runnable() {
                                @Override
                                public void run() {

                                    downloadFile(modal.get(position).getMassege(), position, modal.get(position).getMsgid(),modal.get(position).getTimeSent());

                                }
                            }).start();
                        }
                        return false;
                    }
                }).into(holder.image);

Чтобы загрузить изображение

    public void downloadFile(String src, int position, String messageId,String timeStamp) {
    try {
        java.net.URL url = new java.net.URL(src);
        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setDoInput(true);
        connection.connect();
        int lenghtOfFile = connection.getContentLength();
        InputStream input = connection.getInputStream();
        String[] fileNam = src.split("/");
        OutputStream output = new FileOutputStream(cont.getFilesDir() + fileNam[fileNam.length - 1]);
        byte data[] = new byte[1024];

        long total = 0;
        int count = 0;
        int progressPercentage = 0;
        Intent intent = new Intent();
        intent.setAction(Constants.INTENT_FILTER);
        intent.putExtra(Constants.MESSAGE_POSITION_IN_CHAT_LIST, position);
        intent.putExtra(Constants.DOWNLOADING_FILE, true);

        while ((count = input.read(data)) != -1) {
            total += count;
            // publishing the progress....
            // After this onProgressUpdate will be called
            progressPercentage = (int) ((total * 100) / lenghtOfFile);
            if(progressPercentage==30||progressPercentage==60||progressPercentage==100) {
                intent.putExtra(Constants.PROGRESS, progressPercentage);
                intent.putExtra(Constants.FILE_PATH, cont.getFilesDir() + fileNam[fileNam.length - 1]);
                intent.putExtra(Constants.MESSAGE_ID, messageId);
                cont.sendBroadcast(intent);
            }

            // writing data to file
            output.write(data, 0, count);
            Log.d("Downloding" + progressPercentage, "Count" + count);
            if (progressPercentage > 99) {
                DatabaseHelperChattingToUsers databaseHelperChattingToUsers = new DatabaseHelperChattingToUsers(cont);
                String userId = databaseHelperChattingToUsers.getUserExists(sendTo);
                String splits[] = userId.split("/");
                databaseHelperChattingToUsers.updateContact(new ChattingToUsers(splits[0], sendTo, timeStamp, cont.getFilesDir() + fileNam[fileNam.length - 1],"0"));

                DatabaseHelper1 db = new DatabaseHelper1(cont);
                db.updateContact(messageId, "", "", "", 100);
                String filePath = intent.getStringExtra(Constants.FILE_PATH);
                db.updateChatMessage(messageId, filePath);
            }
        }

    } catch (IOException e) {
        e.printStackTrace();

    }
}

Где я достиг:

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

Проблема, с которой я столкнулся:

При загрузке в recyclerView изображение занимает мало времени для предварительного просмотра изображения в режиме размытия, но представление элемента добавляется в recyclerView и загружается в него через некоторое время

1 Ответ

0 голосов
/ 13 декабря 2018

Glide загрузит изображение для вас, почему вы предпринимаете дополнительные усилия, загружая его через okHttp?

Загрузка полного изображения всегда будет отложена.Это зависит от скорости вашей сети и размера изображения.

Чтобы уменьшить задержку, вы можете хранить изображения разных размеров на сервере .На стороне клиента сначала загрузите изображение небольшого размера и отобразите его в программе просмотра.( Меньший размер изображения == меньше времени на загрузку .)

После нажатия на строку в обзоре утилит загрузите полное изображение, нажав еще один URL.

например

https://www.example.com/images/small/image1.png (250x250 px = 100kb)

https://www.example.com/images/medium/image1.png (1000x1000 px = 400kb)

https://www.example.com/images/large/image1.png (3000x3000 ox = 1200kb)

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