0

Я новичок в Android, поэтому не совсем уверен, что я здесь делаю неправильно. У меня есть gridview, где я показываю кучу изображений, и я использую адаптер для заполнения gridview. Сетка была прокруткой очень медленной/медленной, поэтому я попытался использовать asynctask, чтобы установить imageresource для изображений. По какой-то причине изображения не получают ресурс, поэтому они просто отображаются пустым. Это мой код:Asynctask не устанавливает imageresource для изображения.

class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
      Display display = wm.getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      int width = size.x; 
      imageView.setLayoutParams(new GridView.LayoutParams(width/2,(width/2)*515/400)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(0, 0, 0, 0); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     //imageView.setImageResource(mThumbIds[position]); 
     ImageSetter task=new ImageSetter(imageView); 
     task.execute(position); 

     return imageView; 
    } 

    // references to our images 
    private Integer[] mThumbIds = { 
      R.drawable.zsmall_artemis,R.drawable.zsmall_ash,R.drawable.zsmall_bane,R.drawable.zsmall_belle,R.drawable.zsmall_caleb,R.drawable.zsmall_falcyn,R.drawable.zsmall_jaden,R.drawable.zsmall_julien,R.drawable.zsmall_kody, 
      R.drawable.zsmall_mack,R.drawable.zsmall_maxis,R.drawable.zsmall_nero,R.drawable.zsmall_nick,R.drawable.zsmall_nykyrian 
    }; 

    class ImageSetter extends AsyncTask<Integer,Void,Integer>{ 
     private final WeakReference<ImageView> imageViewReference; 

     public ImageSetter(ImageView imageview){ 
      imageViewReference=new WeakReference<ImageView>(imageview); 
     } 
     @Override 
     protected Integer doInBackground(Integer... ImagePos){ 
      return mThumbIds[ImagePos[0]]; 
     } 


     protected void onPostExecute(int ImageId){ 
      if(isCancelled()){ 
       ImageId=mThumbIds[0]; 
      } 
      if(imageViewReference != null){ 
       ImageView iview = imageViewReference.get(); 
       if(iview != null){ 
        iview.setImageResource(ImageId); 


       } 
      } 
     } 
    } 
} 

картина идентификаторы ресурсов все хранятся в массиве, и «позиция» используются для обозначения которых элемент массива я имею в виду. Как это исправить?

+0

Требуется ли переменная ImageView корректировать значение? Вы проверили это? –

+0

Также я бы рекомендовал использовать библиотеку изображений, такую ​​как UniversalImageLoader или Picasso. –

ответ

1

Возможно, что ImageView или GridView не понимают, что он обновлен. Если это так, его можно зафиксировать вызовом invalidate().

if(imageViewReference != null){ 
    ImageView iview = imageViewReference.get(); 
    if(iview != null){ 
     iview.setImageResource(ImageId); 

     //invalidate call 
     iview.invalidate(); 

    } 
} 

Это может быть больше, чем это. Дайте мне знать, если это сработает для вас.

+0

Спасибо за ответ Matt. Это не сработало, но я решил просто использовать библиотеку. –

0

Я не верю, что есть какие-либо причины для загрузки локальных активов в другой поток. Также, когда пользовательский интерфейс обновляется, он должен выполняться в основном потоке, поэтому многопоточность не помогает. Другие темы должны использоваться для таких вещей, как загрузка изображений и информации из Интернета.

0

Попробуйте использовать библиотеку для загрузки изображений, например Glide. На мой взгляд, Glide - лучший образщик изображений. Он быстрый и лучший в управлении памятью, поэтому вы никогда не получите исключение из памяти.

 Смежные вопросы

  • Нет связанных вопросов^_^