Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

別アクティビティから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を利用する機会はいろいろありそうなので、覚えておきます。

それでは。