0

ok imサーバーから画像をフェッチし、タイトル付きのグリッドビューに表示しています...グリッドビューにbaseadapterを使用してます...すべてが正常に機能しています...データがフェッチされたときにprogressdialogを表示する必要があるという問題が1つだけありますサーバーからグリッドビューに入力されます...現在AsyncTaskを使用して進行状況ダイアログを表示していますが、数秒間(10秒など)フリーズしてからグリッドビューが表示されます...

これは私のbaseadapterクラスです:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = listInflater.inflate(R.layout.grid_adapter_view, null);
        holder = new ViewHolder();
        holder.gridImg = (ImageView) convertView
                .findViewById(R.id.grid_item_image);
        holder.gridTitle = (TextView) convertView
                .findViewById(R.id.grid_item_label);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.gridTitle.setText(catItems.get(position).getName());
    try {
        URL url = new URL(catItems.get(position).getImg());
        Bitmap img = BitmapFactory.decodeStream(url.openConnection()
                .getInputStream());
        holder.gridImg.setImageBitmap(img);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        holder.gridImg.setImageResource(R.drawable.no_image);
        e.printStackTrace();
    }
    return convertView;
}

public class ViewHolder {
    ImageView gridImg;
    TextView gridTitle;

}

そして、これがasynctaskimを使用しています。

mytask = new AsyncTask<Void, Void, Boolean>() {

        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            main_grid.setAdapter(adater);
            if (progress.isShowing()) {
                progress.dismiss();
            }

        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            progress.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            JSONArray jArray = request.getCategories();
            try {
                for (int i = 0; i < jArray.length(); i++) {
                    CategoriesDetail catDetail = new CategoriesDetail();
                    JSONObject jobj = jArray.getJSONObject(i);
                    catDetail.setId(jobj.getString("id").toString());
                    catDetail.setName(jobj.getString("name").toString());
                    catDetail.setImg(jobj.getString("img").toString());
                    catDetail.setOrder(jobj.getString("order").toString());
                    items.add(catDetail);
                }
                adater = new CatGridAdapter(MainActivity.this, items);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                progress.dismiss();
                Toast.makeText(MainActivity.this,
                        "Error: " + e.getMessage(), Toast.LENGTH_LONG)
                        .show();
                return false;
            }

        }

    };

どこで何が間違っているのか教えてください...

4

1 に答える 1

1

UIスレッドでネットワーク操作を行っています。

BitmapFactory.decodeStream(url.openConnection().getInputStream());

これを見てください:http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

編集: ストリームをデコードする代わりにgetView()、デフォルトの画像をgridImgとトリガーに設定するだけですloadBitmap(catItems.get(position).getImg(), holder.gridImg)

public void loadBitmap(String url, ImageView imageView) {
    new BitmapWorkerTask(imageView).execute(url);
}

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(String... params) {
        return BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

これはすべて上記のリンクで説明されています。あなたは本当にそれを読んで、アンドロイドのスレッド化をよりよく理解する必要があります。

于 2013-01-10T23:09:40.527 に答える