問題
掲題のエラーが出る。
java.io.IOException: MAIN_THREAD
なんで?
調査
- android - New GCM API Register Unknown Source Error - Stack Overflow
- android - Google Cloud Messaging register method fails with IOException (MAIN_THREAD) - Stack Overflow
- Deprecated: Obtaining Registration Tokens with gcm.register() | Cloud Messaging | Google Developers
Note that because the GCM methods register() and unregister() are blocking, this has to take place on a background thread.
メインスレッドで呼んではいけないメソッドを呼んでしまったっぽい。
(余談だが、GoogleCloudMessaging.register()はdeprecatedらしい。APIを叩かなきゃいけないっぽいまじだるい)
解決
AsyncTask
クラスを使う。基本こんな感じなので
new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { // ここでやりたかったことをするべし String msg = "なんかした結果"; return msg; } @Override protected void onPostExecute(String msg) { Log.d("onPostExecute", msg); } }.execute(null, null, null);
doInBackgroundの中で、呼びたいメソッドを呼ぶこと。
DRY