Загрузите изображение в переработчик с помощью asynctask и модифицируйте - PullRequest
0 голосов
/ 08 июня 2018

Мой класс LoadImageTask:

    private class LoadImageTask extends AsyncTask<Integer,Void,String>
{

String string;
WeakReference<ImageView> imageViewWeakReference;

    public LoadImageTask(ImageView imageView) {
        imageViewWeakReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected String doInBackground(Integer... params) {

        //get image default
        mService.getExhibitImageById(params[0], true).enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {

                if (response.isSuccessful()) {
                    try{
                        string = response.body();
                        Log.d("AnswersPresenter", "Image loaded!!!!");
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }

                } else {
                    int statusCode = response.code();
                    Toast.makeText(mContext, "Error" + statusCode + response.message(), Toast.LENGTH_SHORT).show();
                }

            }


            @Override
            public void onFailure(Call<String> call, Throwable t) {
                showErrorMessage();
                Log.d("AnswersPresenter", "error loading image!!!");

            }
        });
        return string;
    }

    @Override
    protected void onPostExecute(String string) {
        super.onPostExecute(string);
        if (string !=null && imageViewWeakReference !=null)
        {
            ImageView imv =imageViewWeakReference.get();
            if (imv!=null)
            {
                Bitmap bitmap = Util.StringToBitMap(string);
                imv.setImageBitmap(bitmap);
            }
        }

    }
}

Я использую модификацию внутри метода doInBackground(), чтобы получить строку, закодированную из изображения по идентификатору из API: http://demo.museum.vebrary.vn/api/Exhibit/GetImage?id=3 С идентификатором получено в

@Override
public void onBindViewHolder(Adapter.ViewHolder holder, int position) {

    ExhibitMainScreenModel item = ExhibitList.get(position);
    TextView tvName = holder.tvName;
    tvName.setText(item.getEXHIBITNAME());
    TextView tvDesc = holder.tvDescription;
    tvDesc.setText(item.getDESCRIPTION());
    ImageView imv = holder.imvExhibit;

    /*//get ID and load image by id
    id = item.getEXHID();
    loadImage(id,holder);*/
    id = item.getEXHID();
    LoadImageTask task = new LoadImageTask(holder.imvExhibit);
    task.execute(id);


}

doInBackground возвращает кодировку строки изображения, и в void onPostExecute(String string) Я использую

public static Bitmap StringToBitMap(String encodedString){
    try{
        byte [] encodeByte=Base64.decode(encodedString,Base64.DEFAULT);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 8;
        Bitmap bitmap= BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length,options);
        return bitmap;
    }catch(Exception e){
        e.getMessage();
        return null;
    }
}

, чтобы изменить ее на растровое изображение для отображения изображения.Но doInBackGround возвращает string = null; Пока я отлаживаю, строка в

@Override
        public void onResponse(Call<String> call, Response<String> response) {

            if (response.isSuccessful()) {
                try{
                    string = response.body();
                    Log.d("AnswersPresenter", "Image loaded!!!!");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            } else {
                int statusCode = response.code();
                Toast.makeText(mContext, "Error" + statusCode + response.message(), Toast.LENGTH_SHORT).show();
            }

string = "/9j/4AAQSkZJRgABAgEASABIAAD/4RG1RXhpZgA...", это закодированная строка.я не знаю, почему строка взамен была нулевой?Можете ли вы сказать мне правильный путь?большое спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

Метод enqueue (обратный вызов) асинхронно отправляет запрос и уведомляет обратный вызов о его ответе или если произошла ошибка при обращении к серверу, создании запроса или обработке ответа.

В вашем случае "возвращаемая строка"вызываться перед новым классом Callback ()

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