0

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();
        }
    }
}

どうすればこれを機能させることができますか?私を助けてください!

4

1 に答える 1

1

GCMBaseIntentServiceはIntentServiceを拡張します。

IntentServiceは、たとえばメッセージを受信したときに、onHandleIntent関数で間違ったハンドラーを呼び出すことがあります。非同期タスクを使用すると、この警告を回避できます。

  @Override
    protected void onMessage(Context context, Intent intent) {
    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                          // getForBinaryResponse()
            }
            @Override
            protected void onPostExecute(Void result) {

            }
        };
        task.execute(null,null,null);
    }

AsynchConnectorが機能するはずです

于 2012-09-18T07:39:09.487 に答える