【Androidアプリ作成】InflateExceptionが出た場合の対処法

InflateExceptionが出た場合、
マルチスレッド下でLayoutInflater.inflateを行っていないか確認するといい。

独自クラスを含んだレイアウトをLayoutInflater.inflateで生成する場合、
GUIスレッド以外のスレッドでは動作しない模様。
呼び出すと、以下のような例外が出る。
android.view.InflateException: Binary XML file line #(行番号): Error inflating class <unknown>

ダメな例だが、以前は描画スレッドから以下のような処理をしていた。
呼び出しはGUIスレッド(onCreateやonDrawなど)から行う。

{

final int INTERVAL = 1000/20;

Timer timer = new Timer();

timer.schedule(

new TimerTask() {

@Override

public void run() {

// レイアウト生成

View vw = getLayoutInflater().inflate(R.layout.hogehoge, null);

setContentView(vw);

}

}, 0, INTERVAL

);

}

以下のように書き換えることで、
想定通りの処理が行われるようになった。

{

final int INTERVAL = 1000/20;

final int INFLATE = 1;

// 独自イベント定義

Handler timerHandler = new Handler() {

@Override

public void handleMessage(Message msg){

if ( msg.what == INFLATE )

{

// レイアウト生成

View vw = getLayoutInflater().inflate(R.layout.hogehoge, null);

setContentView(vw);

// 次回のメッセージを作る

long nextTime = Math.max(

msg.getWhen() + INTERVAL

, SystemClock.uptimeMillis());

msg = obtainMessage(INFLATE);

sendMessageAtTime(msg, nextTime);

return;

}

super.handleMessage(msg);

}

};

// 初回のメッセージを送る

Message msg = timerHandler.obtainMessage(INFLATE);

timerHandler.sendMessage(msg);

}

androidはシングルスレッドでGUI処理を行うため、
上記のようにHanderを介して処理する必要がある。
今回のように、レイアウトxmlの構文に問題が無く、上記のような例外が出る場合は
GUI処理に問題が無いか見直してみたほうがいいと思った。

2011.6.13

NECO

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA

*