Мой класс 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..."
, это закодированная строка.я не знаю, почему строка взамен была нулевой?Можете ли вы сказать мне правильный путь?большое спасибо!