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