2013-03-08 10 views
8

私はこの問題を何ヶ月もの間苦しんでいますが、今はパフォーマンスチューニングです。しかし、私は今、必然的に私のアダプターがレコードで最大4回bindViewを実行する必要があると感じているかどうかを知る必要があります。カスタムカーソルアダプタがbindViewを複数回呼び出す

私はグリッドビューに値を設定するカスタムカーソルアダプタを持っています。

が起こっているのかを示すために、いくつかのデバッグ:

03-08 14:46:47.980: I/AdapterCursorGrid(20724): newView() 
03-08 14:46:48.470: I/AdapterCursorGrid(20724): bindView() 
03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Record Id: 1 
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() View Type: 0 
03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:48.600: D/AdapterCursorGrid(20724): bindView() Avatar empty... 
03-08 14:46:48.690: D/AdapterCursorGrid(20724): bindView() Picture creation... 
03-08 14:46:49.490: I/AdapterCursorGrid(20724): bindView() 
03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Record Id: 1 
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() View Type: 0 
03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Avatar empty... 
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Picture creation... 
03-08 14:46:50.320: I/AdapterCursorGrid(20724): newView() 
03-08 14:46:51.170: I/AdapterCursorGrid(20724): bindView() 
03-08 14:46:51.180: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Record Id: 1 
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 
03-08 14:46:51.190: I/AdapterCursorGrid(20724): bindView() View Type: 0 
03-08 14:46:51.190: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:51.190: D/AdapterCursorGrid(20724): bindView() Avatar empty... 
03-08 14:46:51.200: D/AdapterCursorGrid(20724): bindView() Picture creation... 
03-08 14:46:51.870: I/AdapterCursorGrid(20724): bindView() 
03-08 14:46:51.896: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:51.896: I/AdapterCursorGrid(20724): bindView() Record Id: 1 
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() View Type: 0 
03-08 14:46:51.900: I/AdapterCursorGrid(20724): -------------------------- 
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Avatar empty... 
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Picture creation... 

「空のアバター...」と「ピクチャーの作成が...」それは、処理および2特定ImageView秒を更新しているだけで私に語ったデバッグです。

bindViewはなぜ何度も実行されていますか?これの理由は何ですか?これを解決するには何ができますか?

論理的に言えば、bindViewは1回(アダプタが更新されるたびに1回)実行されると期待していますが、私はこれを考えて間違っていますか?

+0

のための答えになります。 'bindView()'は、他の理由で何回も呼び出されていると思われるかどうかに関わらず、 'GridView'で1ms未満で返す必要があります。 ** "画像の作成"で600msを費やすことは非常に悪い**です。 'bindView()'がセルごとに一度だけ呼び出されたとしても、 'GridView'が最初に設定されたときにはMxN回(M行、N列)と呼ばれます。つまり、UIは数秒間* 。 – CommonsWare

+0

@CommonsWareはい、私はこれをayncタスクで実現します。 – HGPB

答えて

13

オペレーティングシステムは、リストを正しく測定しレイアウトするために、bindViewを複数回呼び出すことがあります。これはそれほどバグではありません。これは、スクロールのスムーズさと共に、bindViewの実装ができるだけ効率的である必要がある理由です。 Android Developers Pageに詳しく説明されている便利なヒントやテクニックがあります。

+1

これは 'gridView'と関連があると思いますか? – HGPB

+0

はい。 Androidは、コンテナを適切に測定しレイアウトするのに必要な回数だけ呼び出すことがあります。 – CaseyB

+0

私は現在、ViewHolderパターンを実装しています。私は非同期タスクで画像処理を更新して、次に 'bindView'を再度見直します。厄介な部分は、私の非同期タスクが現在の状態で4回蹴られるという考えです。それが4回呼び出されている理由についての他の提案はありますか? 'GridView'はheightとwidthの両方に対してfill_parentに設定されています。スクラッチヘッド。 – HGPB

0

ImageViewで発見したことの1つは、新しい画像と古い画像がまったく同じサイズでない限り、ImageViewがレイアウトをリクエストすることです。

内部でImageViewgetIntrinsicWidth()getIntrinsicHeight()を使用してレイアウトをリクエストするかどうかを決定します。 (それはあなたの非同期負荷への現在の幅/高さを送信し、バックグラウンドから復帰する前にビットマップのサイズを変更する方が理にかなってが)

すると、このような何かを試してみてください:

public void replaceBitmap(ImageView iv, Bitmap bitmap) { 
    Drawable current = iv.getDrawable(); 
    if (bitmap.getWidth() != current.getIntrinsicHeight() 
      || bitmap.getHeight() != current.getIntrinsicHeight()) { 
     bitmap = Bitmap.createScaledBitmap(bitmap, 
      current.getIntrinsicWidth(), current.getIntrinsicHeight(), true); 
    } 
    iv.setImageBitmap(bitmap); 
} 
10

私もbindViewがあることがわかりました予想よりも何度も呼び出されています。私のListViewの高さは、wrap_contentに設定されていました。それをmatch_parentに変更すると、呼び出し回数が大幅に減少しました。この解決のための

クレジットは、「画像の作成が」* *メインアプリケーションスレッドにすべきではないが何であれ、この質問Custom CursorAdapater's bindView called 77 times...have I done something wrong?

+0

なぜこの答えがまだアップvvされていないのですか?これはすばらしい解決策です。 – faizal

+0

それは技術的に質問された解決策ではありません。 bindViewが過度に呼び出されているのを見ると、高さが誤ってwrap_contentに設定されている可能性があります。 – aaronmarino

+0

ありがとう、あなたは私の一日を救った!この回答は受け入れられた答えでなければなりません:) –

関連する問題