0

こんにちは、私は 2 つのギャラリー コントロール (イメージ ギャラリー) を持つ 2 つのページ間を移動しているときに、メモリ不足のエラーに直面しています。最初のページでプロファイルの詳細を表示し、別のページに移動して詳細を編集し、そこからキャンセル ボタンをクリックして最初のページに戻ることができます。したがって、編集ボタンとキャンセル ボタンを連続してクリックすると、プロファイル編集ページが開いたり閉じたりします。しばらく同じプロセスを繰り返していると、アプリケーションがメモリ不足で実行を開始し、ある段階で、内部メモリが不十分なためにアプリケーションがページのロードに失敗します。この問題を克服するための可能な解決策をチェックしています。アドバイスやコメントをいただければ幸いです。より良い対応を期待します。前もって感謝します。

以下は私のコードです:

edit_button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //startActivity(new Intent(ProfileView.this, ProfileEdit.class));
            startActivity(new Intent(ProfileView.this, ProfileEditLatest.class));
        }
    });

以下は、ギャラリー アダプターの getView メソッドです。

public View getView(int position, View convertView, ViewGroup parent) {

    /*if (position>data.length || position<0) {
        return null;
    }*/
    View vi=convertView;
    ImageView image;
    if(convertView==null){
        vi = inflater.inflate(R.layout.gridview_single, null);

    //TextView text=(TextView)vi.findViewById(R.id.text);;
    image=(ImageView)vi.findViewById(R.id.image);

    final float scale = activity.getResources().getDisplayMetrics().density;
    //int pixels = (int) (100 * scale + 0.5f);
    int pixels = (int) (100 * scale + 0.5f);

    //i.setLayoutParams(new Gallery.LayoutParams(100, 100));
    //image.setLayoutParams(new Gallery.LayoutParams(pixels, pixels));
    image.setLayoutParams(new RelativeLayout.LayoutParams(pixels,pixels));

    //image.setLayoutParams(new LayoutParams(100,100));

    //text.setText("item "+position);
    }
    else{
        image=(ImageView)convertView;
    }
    try{
    vi.setTag(data[position]);
    imageLoader.DisplayImage(data[position], activity, image);
    }
    catch (ArrayIndexOutOfBoundsException e) {
        // TODO: handle exception
    }
    return vi;
}

上記では、 URLで利用可能な実装された遅延読み込みを使用しました

また、プロファイル編集ページには、新しい画像をギャラリーにアップロードするときに使用される静的として宣言されたビットマップ オブジェクトがあります。

上記の詳細が問題の解決策を見つけるのに役立つことを願っています.

4

1 に答える 1

1

getView() メソッドに問題があります。これは、あなたがそれを使用することになっている方法ではありません。代わりに、スタティック ビュー ホルダー クラスを使用する必要があります...

 @Override
public View getView(int position, View v, ViewGroup parent) {
    // Keeps reference to avoid future findViewById()
    ViewHolder viewHolder;

    if (v == null) {
        LayoutInflater li = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.gridview_single, null);

        viewHolder = new ViewHolder();
        viewHolder.mIV = (ImageView) v.findViewById(R.id.image);


        v.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) v.getTag();
    }

  // call ur image loader here
    imageLoader.DisplayImage(data[position], activity, image);
    return v;
}

static class ViewHolder {
    ImageView mIV;

}
于 2012-12-18T11:07:06.187 に答える