Androidの最適な実践性能(3)性能レイアウトの向上(ListViewのスクロールをスムーズにする)

15325 ワード

この授業はあなたに教えます
バックグラウンドスレッドを使うビューオブジェクトを保持するビューホルダあなたも読むべきです
なぜ私のリストは黒いですか?Androidの最適化スムーズなスクロール ListViewは、アプリケーションを保持する主スレッド(UIスレッド)の重い処理がないことである.ディスクへのアクセス、ネットワークへのアクセス、または単独のスレッドSQLへのアクセスを行うことを確認します.あなたのアプリケーションの状態をテストするために、StrictModeを有効にします.
バックグラウンドスレッドを使う
バックグラウンドスレッド(「作業スレッド」)を使用して主スレッド歪を削除するので、ユーザーインターフェースの描画に専念できる.多くの場合、AsyncTaskを使用して、メインライン以外の作業を実行するための簡単な方法が提供される.AsyncTaskは、全 execute()の要求を自動的に並べ、直列に接続する.このような挙動はグローバルの特定のプロセスであり、あなた自身のスレッドを作成する心配がないことを意味します.
以下のコード例では、画像をバックグラウンドスレッドにロードし、その後、ユーザインターフェースが完了するとそれらを適用するAsyncTask が使用される.これはまた,場所における画像の進捗が微調整されることを示し,それらは搭載されている.
// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);
Android 3.0(APIレベル11)を して し、 の はAsyncTaskを することで、 のプロセッサのカーネル で できるようにすることができる. execute()を び す わりに、executeOnExecutor()と の を してもいいし、 じ に してもいい. なカーネルの に じて.
View Holder
あなたのコードは、findViewById()の なローリング に ListViewを び すことができます.これは を させます.Adapterにしても  に ります inflated view ,まだ する と が です.1つの の で り し されるfindViewById()は、「View Holder」を する モードである.ViewHolderオブジェクトの レイアウトのタグフィールド のコンポーネントビューは、すぐにそれらにアクセスすることができます.まず、 な を するためにクラスを る があります.たとえば:
static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}
ViewHolderを し、レイアウト に する.
ViewHolder holder =  new  ViewHolder (); 
holder . icon =  ( ImageView ) convertView . findViewById ( R . id . listitem_image ); 
holder . text =  ( TextView ) convertView . findViewById ( R . id . listitem_text ); 
holder . timestamp =  ( TextView ) convertView . findViewById ( R . id . listitem_timestamp ); 
holder . progress =  ( ProgressBar ) convertView . findViewById ( R . id . progress_spinner ); 
convertView . setTag ( holder );
は、 ビューに にアクセスできます.チェックシートなしで、 なプロセッササイクルを できます.