我正在尝试在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");
,但对我不起作用。
让我向您详细介绍我正在使用的代码和库。
扩展“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);
}
}
class MyApp extends Application{
@Override
onCreate(){
try {
Class.forName("com.myapp.AsynchConnector");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
我该如何使这项工作?请帮帮我!
答案 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应该正常工作