IntentService内でファイルをダウンロードするための非同期タスクを実行しようとしています。ただし、ダウンロードスレッドを開始すると、次の警告が表示され、プロセスが続行されません。
W/MessageQueue(10371): java.lang.RuntimeException: Handler{406ee8f8} sending message to a Handler on a dead thread
この問題について検索したところ、パイプラインスレッドのハンドラーとルーパーに関係がある可能性が高いことがわかりました。原因としては、ファイルをダウンロードするスレッドのプロセスがIntentServiceのハンドラーに渡され、そのプロセスが終了するとすぐに停止することが考えられます。スレッドは、IntentServiceではなく、メインスレッド(UIスレッド)のハンドラーに渡される必要があることを知っています。スレッドを適切なハンドラー(メインスレッドのハンドラー)に渡すために、MainActivityクラスまたはApplicationクラスのonCreate()で次のコードを記述することが機能すると言う人もいます。
Class.forName("name.of.class.doing.asynch.task");
、しかし私のために働いていませんでした。
私が使用しているコードとライブラリについて詳しく説明します。
-IntentService
「GoogleCloudMessaging」(http://developer.android.com/guide/google/gcm/index.html)のクラスGCMBaseIntentServiceを拡張します。上記のエラーは、LogCatのLog.i(TAG、 "STARTING CONNECTION")の後に発生します。
public class GCMIntentService extends GCMBaseIntentService{
public GCMIntentService() {
super(Environment.GCM_SENDER_ID);
}
@Override
protected void onMessage(Context context, Intent intent) {
String[] allowedContentTypes = new String[] { "image/jpeg" };
Log.i(TAG, "STARTING CONNECTION");
AsynchConnector.getForBinaryResponse("MY_URL", new BinaryHttpResponseHandler(allowedContentTypes){
@Override
public void onSuccess(byte[] imageData) {
Log.i(TAG, "SUCCESS!!");
});
}
(... @Override methods follows)
}
-ファイルをダウンロードするためのスレッド
非同期http接続を容易にする「AndroidAsynchronousHttpClient」(http://loopj.com/android-async-http/)を使用します。
public class AsynchConnector{
private static final String BASE_URL = Environment.SERVER_URL;
private static AsyncHttpClient client = new AsyncHttpClient();
public static void getForBinaryResponse(String url, BinaryHttpResponseHandler binaryHttpResponseHandler){
client.get(getAbsoluteUrl(url), binaryHttpResponseHandler);
}
}
アプリケーションのonCreate()
class MyApp extends Application{
@Override
onCreate(){
try {
Class.forName("com.myapp.AsynchConnector");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
どうすればこれを機能させることができますか?私を助けてください!