夏に、友人がAndroidの開発注文をいくつか投げました。 1つ目はフランスのテレビ1台用のストリーミングビデオプレーヤー、2つ目はシンプルなおもちゃです。
開発中(AndroidとJavaでの私の最初の開発経験)、共有したいプログラムが正しく安定して動作するために遵守しなければならないいくつかのルールを見つけました...
この記事は専門家にとっては興味深いものではないかもしれませんが、モバイルデバイスの開発に初めて出会った初心者にとっては、この情報は役に立ちます。
例
明確にするために、以下のルールの例をいくつか提供する小さなプロジェクトを作成しました。
ソース: fileshare.in.ua/3050399
APK: fileshare.in.ua/3050402
ルール1. UIスレッドで複雑な操作を実行しないでください
UIスレッドで複雑な操作を実行すると、ユーザーはUIにアクセスできなくなります(つまり、「ハング」します)。 同時に、このような「フリーズ」中のユーザーアクションは、アプリケーションがハングしているというメッセージと、そのアプリケーションを閉じることを提案する可能性があります。
したがって、複雑な計算はすべて別のストリームに配置する必要があります。
例:
「UIスレッドですべて実行」ボタンをクリックすると、それを行う必要がない方法と、その結果を確認できます。 押すと、子アクティビティが作成されます。このアクティビティでは、onCreate()メソッドに20秒かかる擬似複雑な操作があります。 クリックした後、電話機の[戻る]ボタンを押そうとすると、アプリケーションが「ハング」したというメッセージがポップアップ表示されます。
メインウィンドウの[個別のスレッドでハード操作を行う]ボタンをクリックすると、複雑な操作を実行するアクティビティとスレッドが作成されます。
ルール2:アダプターを正しく使用する
非標準リストを使用する場合、このリストに設定されたアダプターのgetView()メソッドの非表示呼び出しによって、行の作成が行われます。
アダプタのgetView()で、開発者はあらゆる種類の文字列を作成する機会が与えられます。 例:
例:
しない方法:
@Override
public View getView( int position, View convertView, ViewGroup parent) {
final View view = mInflater.inflate(R.layout.row, null );
TextView tv_programm = (TextView) view.findViewById(R.id.channel_proramm);
TextView tv_starttime = (TextView) view.findViewById(R.id.time_start);
TextView tv_endtime = (TextView) view.findViewById(R.id.time_end);
ImageView ib_logo = (ImageView) view.findViewById(R.id.channel_logo);
ProgressBar pb_progress = (ProgressBar) view.findViewById(R.id.programm_progress);
tv_programm.setFocusable( false );
tv_starttime.setFocusable( false );
tv_endtime.setFocusable( false );
ib_logo.setFocusable( false );
pb_progress.setFocusable( false );
ib_logo.setClickable( false );
final String name = mNames[position];
if ( name != null ) {
tv_programm.setText(name);
}
return view;
}
* This source code was highlighted with Source Code Highlighter .
ここでは、リストの各行に対して、新しいViewオブジェクトの作成が呼び出されます。 その結果、リストをスクロールすると、表示されていないメモリオブジェクトが詰まっています。 したがって、ガベージコレクターはより頻繁に呼び出されます(ルール3を参照)。
正しい方法:
private class ViewHolder {
TextView tv_programm;
TextView tv_starttime;
TextView tv_endtime;
ImageView ib_logo;
ProgressBar pb_progress;
}
@Override
public View getView( int position, View convertView, ViewGroup parent) {
ViewHolder holder = null ;
if ( convertView == null ) {
convertView = mInflater.inflate(R.layout.row, null );
holder = new ViewHolder();
holder.tv_programm = (TextView) convertView.findViewById(R.id.channel_proramm);
holder.tv_starttime = (TextView) convertView.findViewById(R.id.time_start);
holder.tv_endtime = (TextView) convertView.findViewById(R.id.time_end);
holder.ib_logo = (ImageView) convertView.findViewById(R.id.channel_logo);
holder.pb_progress = (ProgressBar) convertView.findViewById(R.id.programm_progress);
holder.tv_programm.setFocusable( false );
holder.tv_starttime.setFocusable( false );
holder.tv_endtime.setFocusable( false );
holder.ib_logo.setFocusable( false );
holder.pb_progress.setFocusable( false );
holder.ib_logo.setClickable( false );
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final String name = mNames[position];
if ( name != null ) {
holder.tv_programm.setText(name);
}
return convertView;
}
* This source code was highlighted with Source Code Highlighter .
この例では、画面に収まるオブジェクトの数のみが作成されます。 また、リストの新しい行を描画するために、現在表示されていないオブジェクトが使用されます。 つまり、オブジェクトは新しいオブジェクトを作成せずに再利用されます。
ゲインとは何ですか?
ルール2の例(「不正なリストアダプタを使用」ボタンと「正しいリストアダプタを使用」ボタン)では、1000行のリストが作成されます。
起動すると、アプリケーションはデバイスの合計メモリの3%を使用します。
アダプタを不適切に使用してリストをスクロールする場合、最後のアイテムまでスクロールするには、デバイスのメモリの14%がさらに必要です。 同時に、絵はぴくぴくしています。
アダプターを正しく使用すると、<= 1%が追加で使用され、ページがスムーズに回転します。
ルール3.少ないメモリ割り当て(Javaおよびガベージコレクター)
このルールは、おそらくすべてのJava開発者によく知られています。 しかし、私はC ++でプログラミングしていたので、ガベージコレクター(別名GC)は初めてでした。
オブジェクトが作成および削除される頻度が高いほど、GCが呼び出される頻度が高くなります。 各GC呼び出しには100〜200ミリ秒かかります。 この場合、GCの実行中はすべてのスレッドが停止します。 この場合、フレームのレンダリングが顕著になることがあります(10 fps未満の場合もあります)。
結論:
これは、Androidでの作業中に学んだことのほんの一部であり、誰かがこのトピックに興味を持っている場合は、ヒントとコツの次の部分を書きます。
便利なリンク:
android - developers.blogspot.com -Android開発者ブログ
developer.android.com/videos/index.html-Android開発ビデオ
特に次のことをお勧めします。
Google I / O 2009-Android UIを高速かつ効率的にします。 -ルール2はここから取られます。
Google I / O 2009-Android用のリアルタイムゲームの作成。 -ルール3。
UPD:カルマに感謝、Androidに移行
UPD2:ユーザーハブであるi_homeに、 コメント内の別の便利なsmall-coding.blogspot.comリンクを提供してくれてありがとう