【问题标题】:Load Image to recyclerview by asynctask and retrofit通过 asynctask 将图像加载到 recyclerview 并进行改造
【发布时间】:2018-11-18 09:29:40
【问题描述】:

我的 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() 中使用retrofit 从api 获取一个由id 编码的图像字符串:http://demo.museum.vebrary.vn/api/Exhibit/GetImage?id=3 有id进去了

@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; 当我调试时,字符串 in

@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..." ,这是一个编码字符串。我不知道为什么返回的字符串为空? 你能告诉我正确的方法吗? 非常感谢!

【问题讨论】:

  • 为什么不用 Glide 来加载图片呢?它会让你的生活变得简单。 github.com/bumptech/glide
  • 我不想独立显示图像和文本。之前显示文本,我们可以在加载图像时滚动回收器(UI 线程主不阻塞)。就像脸书应用一样。 Glide 能做到吗?
  • 是的,glide 会在后台加载图片,你甚至可以有一个占位符。大多数开发者使用 glide 或 picasso:github.com/square/picasso
  • 谢谢!我会试试的

标签: android android-recyclerview android-asynctask retrofit2


【解决方案1】:

方法 enqueue(Callback callback) 异步发送请求并通知回调其响应,或者如果发生错误与服务器交谈、创建请求或处理响应。

在你的情况下 在新的 Callback() 类之前调用​​“返回字符串”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多