background-无法在线程中创建handler

问题描述

无法在线程中创建handler

错误:

logUser("An error happend while creating graph:"+ getErrorMessage());

getErrorMessage()无法在线程中创建handler,线程没有调用Looper.prepare(),而logUser 是用来显示toast信息的函数。

void prepareGraph() {
    logUser("loading graph (" + Helper.VERSION + "|" + Helper.VERSION_FILE
            + ") ... ");
    new MyAsyncTask<Void, Void, Path>() {
        protected Path saveDoInBackground(Void... v) throws Exception {
            GraphHopper tmpHopp = new GraphHopper().forAndroid();
            tmpHopp.contractionHierarchies(true);
            tmpHopp.load(mapsFolder + currentArea);
            logUser("found graph with " + tmpHopp.getGraph().nodes() + " nodes");
            hopper = tmpHopp;
            return null;
        }
        protected void onPostExecute(Path o) {
            if (hasError()) {
                logUser("An error happend while creating graph:"
                        + getErrorMessage());
            } else {
                logUser("Finished loading graph. Touch to route.");
                calcPath(52.534185, 13.348732, 52.53857,
                        13.41259);
            }
            finishPrepare();
        }
    }.execute();
}

解决方案

同上求解,请问你解决了吗?

解决方案二:

需要在主线程中实例化 AsyncTask 。AsyncTask 源代码创建一个handler来调用你的onPreExecute()onPostExecute()等方法。如果这个handler没有在主线程实例化。Android系统就会抛出异常,告诉你线程和Handler的互动缺少 Looper.prepare()方法的调用。

时间: 2024-12-30 23:28:29

background-无法在线程中创建handler的相关文章

Android App在线程中创建handler的方法讲解_Android

相关概念1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue中取出Message进行处理: 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循

Android App在线程中创建handler的方法讲解

相关概念 1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue中取出Message进行处理: 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息

handler-Android。在无限循环的线程中创建Message对象,无限出现GC调用。

问题描述 Android.在无限循环的线程中创建Message对象,无限出现GC调用. 我在Android开发中.开启了一个线程,这个线程是无限循环的.并且在这个线程里,我通过创建Handle的Message对象,然后handler.sendMessage(msg).可是这样一来,LOGCat上就一直出现GC_CONCURRENT.请问我该怎么修改代码,或者用哪种方式才能即实现功能,又能减少GC的调用.具体代码如下://线程private class getData_thread extends

如何在线程中创建可以响应事件的窗体

要在主程序中使用线程创建一个窗体,这个窗体要能接受事件但是使用如下方法创建的窗体,无法响应用户输入的事件,AsyncCallback myformshowcallback = new AsyncCallback(CreatAndShowForm); myformshowcallback.BeginInvoke(null, null, null); private void CreatAndShowForm( ){    myShow test = new myShow();    test.Sh

Android中关于Handler的若干思考

本文包括与Handler有关的以下问题: (1)Handler的作用 (2)为什么Android中要设计为只能在UI线程中去更新UI呢? (3)Handler的两个异常 (4)Handler.Looper MessageQueue之间的关系(源码角度) (5)跟线程相关的Handler,即HandlerThread(源码角度分析) (6)主线程往子线程发消息   一.Handler的作用: (1)在非UI线程中完成耗时操作,在UI线程中去更新UI. (2)可以在主线程中发送延时消息.   二.为

Android--Handler的使用方法:在子线程中更新界面

本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联.     Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建

android开发教程之子线程中更新界面_Android

每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联.Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了.由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面.

【Android开发】线程与消息处理-Handler消息传递机制之Looper

在前面已经介绍了在Android中如何创建.开启.休眠和中断线程.不过,此时并没有在新创建的子线程中对UI界面上的内容进行操作,如果应用前面介绍的方法对UI界面进行操作,将抛出异常. 为此,Android中引入了Handler消息传递机制,来实现在新创建的线程中操作UI界面.下面将对Handler消息传递机制进行介绍. 1.循环者Looper介绍 在介绍Looper之前,需要先了解一下MessageQueue的概念.在Android中,一个线程对应一个Looper对象,而一个Looper对象又对

android开发教程之子线程中更新界面

每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联.Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了.由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面.