android の static 変数 が気持ち悪い

Android_Application_Framework_FAQ___Android_Developers

整理してメモ。

2つの状況。

その1:

static 変数がプロセスに保持されている。

プロセスが生きたままだとと思っていたら死んでいる。

そのアプリを画面に表示したときにプロセス再起動。

static 変数が初期化される。

その2:

static 変数がプロセスに保持されている。

プロセスが死んでいると思ったら生きている。

そのアプリを画面に表示したときに既存プロセス利用。

static 変数は初期化されず、そのまま利用される。

結局、アプリの画面を表示したときにそれが

「再起動されたプロセス(static変数初期化)」なのか
「再利用されたプロセス(保持されたstatic変数)」なのか

をはっきり認識しづらいのが問題。

めんどくさいので雑にいうと

その表示した画面が

「アプリ全体を新しく起動した画面」なのか
「一部しれっと生きてた情報を再利用した画面」なのか

と思ったほうが簡単で直感的なのか。

細かくいうといろいろあるのだろうけども。

極端に、

「アプリプロセスはいつでも死ぬ可能性がある」

ということにしておいて、消えて困る情報はアプリプロセス以外の
場所に保持しておくとよし、と。

Preference・データベース・ファイル…

(singleton がどうのこうのはアプリプロセスあっての)

なんで「static変数」がよく問題になるのかは、AndroidなJava 以外のように

「異なるライフサイクルを持つクラス間で、アプリ内で見通しよく簡単に情報を持ち回りたい」

から。

これには「Applicationクラス」を使う、と。

Applicationクラスを継承して、データの共有をする。 « Tech Booster

AndroidアプリでContextを持ち回したい話 - FLYING

MyAppのstatic変数を使うことで、アクティビティのライフサイクルに影響を受けずに値を保持し続けることができます。
またstaticメソッドを用意することで、アプリ内のどこからでもアクセスすることができます。

各オブジェクトの状態をアプリから監視させたり。

Android - Applicationクラスを使ってObserverパターンを実装する - Qiita

念のためそこら公式ドキュメントをみる。

続きを読む >>


使ってみた「Google Cast SDK」その1 - CastHelloText-chrome

こんなの出てたので。

Google_Developers_Blog__Ready_to_cast__Chromecast_now_open_to_developers_with_the_Google_Cast_SDK

Google Developers Blog: Ready to cast: Chromecast now open to developers with the Google Cast SDK

YouTube動画を見てみた。

なんのことだかよくわかりません。

サンプルがあるようなので動かしてみようと。

たくさんサンプル公開されています。

Google_Cast

Google Cast

いちばん簡単そうな「CastHelloText-chrome」。

まず、WEBサーバに置いたHTMLにブラウザでアクセスして文字を入力する。

Hello_World

すると、テレビにその文字が表示されます。

Evernote

なんなんでしょうこれは!!ww

で、手順と思ったこと。

続きを読む >>


View Holder Pattern を使わない 高速 ListView だと!?

CursorAdapter だよな、これって。

...
public View newView(Context context, Cursor cursor, ViewGroup parent) {
 
    View view = LayoutInflater.from(context).inflate(R.layout_my_view, null);
 
    TextView tv = (TextView) view.findViewById(R.id.text1);
    ImageView iv = (ImageView) view.findViewById(R.id.image1);
 
    view.setTag(R.id.text1, tv);
    view.setTag(R.id.image1, iv);
 
    return view;
}
 
public void bindView(View view, Context context, Cursor cursor) {
 
    ((TextView) view.getTag(R.id.text1)).setText(cursor.getString(cursor.getColumnIndex(COL_TEXT_1)));
    ((ImageView) view.getTag(R.id.image1)).setImageResource(R.drawable.image);

}
...

タグってやつは、便利だなあ。

[Java] Fast ListView scroll without ViewHolder Pattern - Pastebin.com

android - What bindView() and newView() do in CursorAdapter - Stack Overflow