JavaMPD という、MPDクライアントのためのJavaライブラリがあります。
これを使ってAndroid向けのクライアントアプリをつくろうとしたのですが、MPDconnectionExceptionが出て起動しない。
その解決法をメモします。
最初どう書いたか
Activity内のonCreateに、こんなかんじで書きました。
1
2
3
4
5
6
7
8
9
10
11
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
Button b = ( Button ) findViewById ( R . id . button );
b . setOnClickListener ( new OnClickListener () {
@Override public void onClick ( View v ) {
// TODO Auto-generated method stub
add_mpd ();
}
});
}
ボタンを押すとadd_mpdを実行するという単純なActivityです。 add_mpdは、最初このように書きました。
1
2
3
4
5
6
public void add_mpd (){
String child ;
child = "192.168.x.x" ; // Local IP Address
mpd = new MPD ( child );
Log . v ( mpd . getVersion ());
}
これでコネクションが確立すれば、ログにMPDのバージョンが出力されるはずでした。
これでは何故か、エラーが出て強制終了されます。
解決法
強制終了される現象は、Threadを用いることで解消出来ました。
変更後のadd_mpdはこちら。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void add_mpd (){
new Thread ( new Runnable (){
public void run () {
try {
String child ;
child = “ 192.168 . x . x " //local IP Address
mpd = new MPD ( child );
Log . v ( mpd . getVersion ());
} catch ( UnknownHostException e ) {
e . printStackTrace ();
} catch ( MPDConnectionException e ) {
e . printStackTrace ();
}
}
} ). start ();
}
Androidは処理のスレッドや、同期、非同期をしっかり指定してあげないとエラーが起こりますね。
確か、HttpGetなんかを扱った時もこんなかんじでした。
非同期処理にしてもいいので、AsyncTaskなんか使ってもいいでしょう。てか、おそらくそっちのほうが推奨ですね。
無知が招いた悲劇でした。
追伸
公式サイトはここ なんですが、重すぎてアクセス出来ないので、Google翻訳を通して閲覧する のをおすすめします。
JavaDocはここ でも見ることができます。
参考
http://stackoverflow.com/questions/12165829/progressdialog-wont-show-up