startManagingCursorはdeprecated–passgenを最新SDKに対応させる2

昨日は「ActionBarにアイコンを追加してみた」という記事で最新UIに対応する見た目にする努力をしてみました。

そのときにソースを見ているとAdd @SuppressWarnings ‘deprecation’ to ‘setListViewAdapter()’なんていうのがちょこちょこと出てまして、なんでだろとリファレンスを見てみると次のようなことがわかってきました。

  • startManagingCursorは、Fragmentとの兼ね合いもあってCursorLoader経由でUIスレッドではなくバックグラウンドで実行されるようになった
  • SimpleCursorAdapterのコンストラクタには、フラグを追加する必要がある
  • クリップボードにコピーするときにコピーした内容を識別するための名前とMIMEタイプを指定するようになった

そんなわけで、今日も対応した内容に書き換えていくことにします。

クリップボードにコピーする

まずは、簡単なところからクリップボードへのコピーです。

importするところから、まず変わりました。

import android.content.ClipboardManager;

以前は、android.text.ClipboardManagerでしたが、テキスト以外もコピーする必要があるということで、contentに変わったんでしょうかね。

 

基本的に、直接インスタンス化するのではなく、SystemServiceから、ClipboardManagerのインスタンスを受け取るところは変わりません。

ClipboardManager lCM = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
その次のコピー方法自体が変わりました。

ClipData lClip = ClipData.newPlainText_COPIED_PASSWORD_TAG, lCsr.getString(lCsr.getColumnIndex(PassTable._DB_PASS)));
lCM.setPrimaryClip(lClip);

ClipDataクラスというデータ中継用のクラスができて、そのデータが何なのかの識別子とデータ自体を持つことができるようになっています。そして、PrimaryClipにそのデータを設定することでクリップボードへのコピーができます。

読み出す場合は、getPrimaryClip()を使います。もらってくるデータはClipDataです。getItemCount()で個数を調べたあと、getItemAt()で必要なデータを取り出すということになります。

 

カーソル設定の方法が変わった

次のstartManagingCursorとSimpleCursorAdapterは、同じsetListViewAdapterのなかで見つけたので同時に修正をします。

setListViewAdapterは、Cursorを受け取って新しい設定のCursorかを判定してListViewに設定し直すメソッドでした。

引数にしたCursorは、ContentProviderのquery結果だったのでこのqueryの内容を引数にして、setListViewAdapter内で新たにCursorLoaderへの引数として採用することでその後の設定を減らしています。

        CursorLoader lCursorLoader = new CursorLoader (this, uri, projection, selection, selectionArgs, sortOrder);
        mCsr = lCursorLoader.loadInBackground();
     
        mAdapter = new SimpleCursorAdapter(this, R.layout.passlist, mCsr, lFrom, lTo, 0);

ドキュメントはこの辺り(CursorLoader)にあります。
CursorLoaderは、AsyncTaskLoaderを使うことでUIスレッドをブロックすることなく、Cursorを管理するということでした。別スレッドでCursor query管理をするってことみたいです。

それから、SimpleCursorAdapterのコンストラクタが変わっていて、従来は

SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)

だったものに

SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flag)

とフラグの設定が加わりました。…が、onContentChangedを使って内容が変更された通知を受け取る設定を使わない場合は、特に設定せず0でいいようです。

 

CursorLoaderについては、もう少し動かしてみて本当にこれでいいのかどうかを検証する必要はありますが、いまのところ特に動作が止まるようなことにはなっていません。

広告

About sato_c

小学生の頃にインベーダーゲームやPC-8001やApple][といったものを知ってしまい、それ以降ずーっとゲーム好き。でも、あんまりうまくはありません。 仕事は当初はゲーム関係のプログラムやサウンドをやっていましたが、WEB関係を通ったあと、遊技機関係のプログラムやサウンドをやっています。あまり節操がないのか。 現在はJavaですてきなコードを書けるように勉強中。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。