【发布时间】: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