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