IntentService里面的Android AsynchTask

时间:2012-09-18 06:56:29

标签: android android-asynctask intentservice

我正在尝试在IntentService中运行异步任务来下载文件。但是,当我开始下载线程时,我收到以下警告,并且该过程不会继续。

W/MessageQueue(10371): java.lang.RuntimeException: Handler{406ee8f8} sending message to a Handler on a dead thread

我搜索了这个问题,发现它很可能与Pipeler Threading的Handler和Looper有关。原因可能是下载文件的线程进程被传递给IntentService的Handler,它在完成其进程后很快就会死掉。我知道线程应该传递给主线程(UI线程)的Handler,而不是IntentService。 有人说在MainActivity类或Application类的onCreate()中编写以下代码是有效的,以便将线程传递给正确的Handler(主线程的处理程序),

Class.forName("name.of.class.doing.asynch.task");

,但对我不起作用。

让我向您详细介绍我正在使用的代码和库。

- IntentService

扩展“Google Cloud Messaging”的类GCMBaseIntentService(http://developer.android.com/guide/google/gcm/index.html)。上面的错误发生在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)
 }

- 下载文件的线程

使用“Android异步Http客户端”(http://loopj.com/android-async-http/),这有助于异步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();
        }
    }
}

我该如何使这项工作?请帮帮我!

1 个答案:

答案 0 :(得分: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应该正常工作