Как вызвать метод getView в baseAdapter в Android из другого компонента WebService? - PullRequest
0 голосов
/ 19 марта 2010

Адаптер в моем коде выглядит следующим образом, я расширяю базовый адаптер:

@Override
 public View getView(final int position, View convertView, ViewGroup parent) {
  ViewHolder vHolder;

  // if (convertView == null) {
  vHolder = new ViewHolder();
  convertView = mInflater.inflate(R.layout.home_item, null);
  vHolder.albumIcon = (ImageView) convertView
    .findViewById(R.id.albumIcon);
    try {
   Bitmap icon = aws.getAlbumImg(itemInfolist.get(position)
     .getAlbumInfoCol().get(0).getAlbumID(), 0);
   if (icon != null) {
    vHolder.albumIcon.setImageBitmap(icon);
   } else {
    vHolder.albumIcon.setImageBitmap(BitmapFactory.decodeResource(
      context.getResources(), R.drawable.album));
   }
  } catch (Exception e) {
   vHolder.albumIcon.setImageBitmap(BitmapFactory.decodeResource(
     context.getResources(), R.drawable.album));
  }

      convertView.setTag(vHolder);
  return convertView;
 }

Однако я загружаю изображение асинхронно,

Когда вызывать Значок растрового изображения = aws.getAlbumImg (itemInfolist.get (position) .getAlbumInfoCol (). Get (0) .getAlbumID (), 0);

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

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

03-19 07: 46: 33.241: ОШИБКА / AndroidRuntime (716): android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представления, может касаться его представлений.

HomeAdapter mHomeAdapter;

 public AlbumWS(HomeAdapter homeAdapter) {
  mHomeAdapter = homeAdapter;
 }

And after download,

public boolean getAlbumImgWS(final ArrayList<Integer> albumIDs) {

  new Thread(new Runnable() {

   @Override
   public void run() {
    // TODO Auto-generated method stub
    AlbumInfoWS aiws = new AlbumInfoWS();
    for (int i = 0; i < albumIDs.size(); ++i) {
     if (ABSCENTALBUMIMGS.contains(albumIDs.get(i))) {
      continue;
     }
     if (FunctionUtil.isExist(albumIDs.get(i))) {
      continue;
     }
     String urlPath = aiws.getAlbumImage("en_US",
       Config.IMG_ATTIBUTETYPE, albumIDs.get(i));
     boolean ret = FunctionUtil.simpleDownload(Config.HOST
       + urlPath, "/data/data/com.greysh.amped/img/"
       + albumIDs.get(i) + ".jpg");
     if (!ret) {
      if (!ABSCENTALBUMIMGS.contains(albumIDs.get(i))) {
       ABSCENTALBUMIMGS.add(albumIDs.get(i));
      }
     }
     mHomeAdapter.notifyDataSetChanged();
    }
   }
  }).start();
  return true;
 }

1 Ответ

1 голос
/ 19 марта 2010
android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

Это исключение означает, что вы пытаетесь обновить пользовательский интерфейс из другого потока - в Android это запрещено. Вы должны использовать Handler, чтобы опубликовать изменения в основном потоке пользовательского интерфейса. Вместо

new Runnable() {
    public void run() {
    ...
    }
};

попробовать

mHandler.post(new Runnable() {
                  public void run() {
                  ...
                  }
              };);
...