別アクティビティからgetAssets()の呼び出し
こんばんは、かささぎです。誰か風と雪止めて。
最近Atcoderを始めたのですが、特筆するような結果を残せなかったので、今回のネタはAndroidです。悲しい。
getAssets関数を別クラスから呼び出した際にエラーが起こり、解決できたためメモしときます。
参考文献です。http://individualmemo.blog104.fc2.com/blog-entry-41.html
getAssets関数はassetsフォルダ内のファイルを利用するために用いられる関数ですが、普段はこのように利用することが多いと思います。
AssetManeger mngr = this.getAssets(); InputStream is = mngr.open("fileName");
これを別クラスから実行した場合、mngr,isがnullになります(普通はtry内に書きますので、catchブロックでスタックトレース(ぬるぽ)が得られます)。
原因はthisがnullになっていることです。
このthisとは、Activity contextという、アプリケーションの情報をグローバルで受け渡すためのインターフェースが入るのですが、実行中のactivity以外ではnullになるという仕様があります。
つまり別クラスから呼び出す際には、実行中のアクティビティのcontextを渡してやる必要があります。
こんな感じです。
<呼び出し元>
Hoge hoge = new Hoge(); hoge.readFile(this);
<呼び出し先>
public static void Hoge(Context context){ InputStream is = null; try{ AssetManager mngr = context.getAssets(); is = mngr.open("fileName"); }... }
ちなみに、contextにはApplication ContextとActivity Contextがあります。Applicationの方はアプリケーションと連動して、同じContextオブジェクトである(静的な)もので、Activityの方はActivityの変更で動的に変化するものといった違いがあります。情報として持っているものに違いはないので、どちらでもいいそうです。
Activity Contextを渡すためには、引数をgetApplicationContext()にします。
Hoge hoge = new Hoge();
hoge.readFile(getApplicationContext());
今回はgetAssetes()関数の呼び出しでしたが、アクティビティ外でContextを利用する機会はいろいろありそうなので、覚えておきます。
それでは。