新人求助,是关于Android主线程和子线程的问题

在编一个百度地图校园导航的程序,程序有时候能运行,有时候不能运行,不能运行时会报这个: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
麻烦各位朋友帮我看看该怎么改OnCreate方法中的代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

     . . . . . .

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        SDKInitializer.setCoordType(CoordType.BD09LL);
        setContentView(R.layout.activity_main);
        position=(TextView)  findViewById(R.id.position_text_view) ;
        accessPermission();
        initView();
        initLocation();
        Button mbutton1=(Button)findViewById(R.id.button1);
        mbutton1.setOnClickListener(MainActivity.this);
        Button mbutton2=(Button)findViewById(R.id.button2);
        mbutton2.setOnClickListener(MainActivity.this);
        mbutton3=(Button)findViewById(R.id.button3);
        mbutton3.setOnClickListener(MainActivity.this);
        mbutton4=(Button)findViewById(R.id.button4);
        mbutton4.setOnClickListener(MainActivity.this);
        mbutton5=(Button)findViewById(R.id.button5);
        mbutton5.setOnClickListener(MainActivity.this);
    }

           . . . . . . 

        @Override
    public void onClick(View v){
        switch(v.getId()){
            case R.id.button1:
                if((flag%2)==0){
                    mbutton3.setVisibility(View.VISIBLE);
                    mbutton4.setVisibility(View.VISIBLE);
                    mbutton5.setVisibility(View.VISIBLE);
                    flag+=1;

                }else if((flag%2)==1){
                    mbutton3.setVisibility(View.GONE);
                    mbutton4.setVisibility(View.GONE);
                    mbutton5.setVisibility(View.GONE);
                    flag+=1;
                }
                break;
            case R.id.button2:
                initNavi();
                startBikeNavi();
                break;
            case R.id.button3:
                Toast.makeText(MainActivity.this,"请在地图上长按您要去的地方设置目的地",Toast.LENGTH_LONG).show();
                mbutton3.setVisibility(View.GONE);
                mbutton4.setVisibility(View.GONE);
                mbutton5.setVisibility(View.GONE);
                break;
            case R.id.button4:
                Toast.makeText(MainActivity.this,"你点击了button2",Toast.LENGTH_LONG).show();
                mbutton3.setVisibility(View.GONE);
                mbutton4.setVisibility(View.GONE);
                mbutton5.setVisibility(View.GONE);
                break;
            case R.id.button5:
                Toast.makeText(MainActivity.this,"你点击了button2",Toast.LENGTH_LONG).show();
                mbutton3.setVisibility(View.GONE);
                mbutton4.setVisibility(View.GONE);
                mbutton5.setVisibility(View.GONE);
                break;
            default:
                break;
        }
    }
0

7个回答

安卓主线程,,,UI线程,,是不允许做耗时操作的,,,

你需要用个new一个子线程去完成耗时操作,,然后给主线程结果。

0
tsun1217
tsun1217 好的,多谢
接近 2 年之前 回复
Small_Mouse0
小鼠标丶 http://www.imooc.com/learn/406,,你看下安卓异步加载吧,,
接近 2 年之前 回复
tsun1217
tsun1217 能举个有代码的例子吗?
接近 2 年之前 回复

我到网上查了下,好像是onCreate中有耗时的操作,希望各位给点建议

0

accessPermission();
initView();
initLocation();
这几个操作该很耗时,应该怎么放呢

0

耗时的操作new一个子线程去执行啊

0
tsun1217
tsun1217 Android 刚接触,不懂怎么new一个子线程啊
接近 2 年之前 回复

new Thread(new Runnable() {

@Override
public void run() {
    // 放你执行的操作
}

}).start();

0

new Thread()
{
public void run()
{

 }

}.start();

0

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread()
{
public void run()
{
//此处发你的这些操作
}
}.start();

}
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android在子线程更新UI主线程的六种方法(全网最全)
最近用了一下okhttp,原本以为异步callback里面的onResponse是运行在主线程的,后面发现在onResponse里面放了Toast,半天没有反映,一度以为Toast写错了,把Toast放外面发现可以正常弹出提示的,后来查了下资料,原来okhttp的callback,onResponse其实还是运行在子线程的,那么如果在子线程更新主线程呢。这里提供几种方法。rn         /
Unity进阶篇:主线程和子线程概念及注意点
先理解一下什么是线程:nn线程是操作系统级别的概念,现代操作系统都实现并且支持线程,线程的调度对应用开发者是透明的,开发者无法预期某线程在何时被调度执行。基于此,一般那种随机出现的BUG,多与线程调度相关。nn什么是Unity主线程?nn通俗点讲,Unity的主流程生命周期函数就是主线程。nn常用的生命周期函数:nnAwake():唤醒事件,游戏一开始运行就执行,只执行一次。nnOnEnable(...
多线程通信ThreadDemo
实现了子线程与主线程之间的通信;主线程给自己发消息、主线程给子线程发消息、子线程给主线程发消息等。
android 主UI线程与子线程之间传递数据Bundle
**n小白使用bundle在线程之间传递数据。n**n实现从云端数据库中拿出数据,并将数据传递给UI主线程,并更新UI界面。n因为Android 3.0以后使用网络相关的东西不能直接在主线程实现。所以需要创建一个子线程,从云数据库中获取数据。n创建一个GetDataThread线程类npublic class GetDataThread extends Thread {n //重点n pr...
主线程和子线程的区别
**主线程和子线程的区别**n每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 n 线程唯一标示符:Thread.CurrentThread.ManagedThreadID;nUI界面和Main函数均为主线程。n被Thread包含的“方法体”或者“委托”均为子线程。n委托可以包含多个方法体,利用this.Invoke去执行。n也可以定义多种方法体,放在Thread里面去执行。则此方法体
主线程 子线程 同步请求 异步请求
昨天小编突然想到一个问题,那就是主线程避免进行耗时操作,我想到 好像我的请求网络操作都是在主线程中进行的啊,后来一想不对啊,如果都是在主线程中进行的,应用早不可以用了,经过小编的试验得出下面结论,特此记录一下:n 1 同步请求必须另开线程,否则报错:android.os.NetworkOnMainThreadException n 2 异步请求本身就已经开启了新的线程,所以在写在应用生命周期中没
NSURLSession与线程问题
一.NSURLSession有两种使用方式:nn1.NSURLSession* session = [NSURLSession sharedSession]nn此方式,没有设置NSURLSession的delegate,因此不会走代理接口,所以若要实现有意义的功能,在创建各种Task的时候,需要使用带completionHandler的接口,如:nn NSURLSessionDownl
python进程,主线程, 子线程的关系
      进程是存储数据的空间,而线程是cpu执行的指令。就好比进程是一个房间,线程就是房间中的每一个人。所以每一个进程都必定包含至少一个线程。进程和线程是相对独立的,但又是相互依赖的。当主线程执行完毕后,子线程随即停止。话不多说,直接上代码!!!import threading, timendef run(n):n print('task start', n)n time.slee...
主线程、子线程、守护线程
import static java.util.concurrent.TimeUnit.*;     rnpublic class DaemonTest {     rn    public static void main(String[] args) throws InterruptedException {     rn        Runnable r = new Runnable() 
线程中主线程与子线程之间的关系
1、最常见的情况,主线程中开启了一个子线程,开启之后,主线程与子线程互不影响各自的生命周期,即主线程结束,子线程还可以继续执行;子线程介素,主线程也能继续执行。nn测试代码如下:nnpublic class TestThread{npublic static void main(String[] args) throws InterruptedException {nSystem.out.prin...
【Android实战】----Android Retrofit是怎么将回调函数放到UI线程(主线程)中的(源码分析)
一、简介n集成过Retrofit的猿们都知道,callback是运行在主线程中的,不用再通过异步机制处理。那么是怎么实现的呢,下面从源码角度进行分析,其中涉及到Android异步机制(Handler、Message、Looper、MessageQueue),猿们自行脑补。nnn二、Retrofit的创建n下面从Retrofit的创建开始,其中的秘密也在其中nRetrofit mRetr
多线程中主线程与子线程执行的顺序
在我们刚刚接触多线程时,所练习的Demo可能会达不到我们期待的运行结果,这其实有两种可能:nn第一,是巧合,CPU可能是一直执行完一个线程再去执行另一个线程。所以我们看到的结果一直是没有交替执行的。n解决办法是:把运行的次数放大,10次不行就100次,100次不行就1000次,1000次不行5000次,其实1000次的时候也就差不多出现了交替运行。nn//线程任务类npublic class Th...
多线程与NSTimer
1.Ios主线程,也称UI线程,在主线程中使用NSTimer,runloop是自动开启的,(如果NSTimer当前所处的线程正在进行大数据处理(假设为一个大循环),NSTimer本次执行会等到这个大数据处理完毕之后才会继续执行(类似操作列表的滑动过程,定时器不会),所以用NSRunLoopCommonModes模式,而NSDefaultRunLoopMode不可行)。nn在主线程中调用nnnNST...
java,辨别子线程、主线程
npublic class Main {nn public static void main(String[] args) throws Exception {n Thread t = new Thread(new Worker());//Thread-0n t.start();//Thread-0nn //Thread.sleep(200);//m...
iOS 接收通知的线程一定是主线程吗?
问题:在主线程中A对象监听到通知B后,调用函数functionX。然后我们开启一条子线程,在子线程中发出通知B。现在问A对象执行方法functionX时是在哪个线程?nnn In a multithreaded application, notifications are always delivered in n the thread in which the notification wa...
另外,Volley中所有的请求都在一个额外线程中执行,而不会阻塞你的“主线程”。
另外,Volley中所有的请求都在一个额外线程中执行,而不会阻塞你的“主线程”。
关于主线程和其他线程之间的关于栈内存的一些问题(含图解)
//首先要明确java程序的运行原理:java命令调用虚拟机,此时虚拟机相当于一个应用程序,该程序启动主线程,主线程调用某个类的main方法。nn//其次明确一个线程一个栈内存nn//所以在下面的代码中有两个线程一个是主线程,一个是t线程,t.start()启动线程后告诉jvm分配一块儿栈内存,也就是此时有两块儿栈内存,一块儿是主线程的栈内存,一块儿是t线程的栈内存。即使当main方法运行完毕,程...
iOS 通知和kvo中的线程问题
ios中的通知和kvo使用非常常见,通常我们都是在主线程添加观察者和发送通知,但是如果我们是在子线程发送通知呢?rn测试代码:rn接收通知 rnrn- (void)viewDidLoadrnrn{rnrn    [superrnviewDidLoad];rnrn    [[NSNotificationCenterrndefaultCenter] addObserver:selfrnselector
关于android中主线程和子线程间的相互通讯
1.子线程向主线程发送消息rnrnHandler mHandler = new Handler(){        @Override      public void handleMessage(Message msg) {          super.handleMessage(msg);          switch (msg.what) {          case 0:      
进程and主线程and子线程and守护线程的关系
当下面的多线程python程序运行时,主线程运行10秒后结束,t 线程会运行20秒,进程会等待t 线程结束后才会结束。nnnfrom threading import Threadnimport timenndef foo(x):n for i in range(1, x+1):n print(i)n time.sleep(1)n f = open('text.txt', 'w')n f.cl...
Android死角——回调函数到底执行在主线程还是子线程?
写程序多了,发现回调函数用的越来越多,但是不知道到底回调函数执行在那个线程。nn这算我的一个知识死角,写个回调去试试。nn下面动手!nnnn首先,我新建了个项目,然后开始写,emmmm…..这也得想想。我水平太差了吧也。nnnn1、定义接口类 nnpublic interface CallBackInterface {n void callbackMethod();n}nnnn2、需要调用回...
主线程和子线程的同步控制
一个线程的结束有两种途径,一种是象我们下面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。另外需要说明的是,一个线程不能被多个线程等待,也就是说对一个线程只能调用一次pthread_join,否则只有一个能正确返回,其他的将返回ESRCH 错误。rn在Linux中,默认情况下是在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设
RxJava使用(二)线程之间的切换
在开发当中只要不是静态页面,我们都要对后台服务器发起网络请求。nn总所周知,发起网络请求是一个耗时操作,一般的耗时操作都必须开启一个子线程来进行请求,从网络端拿到数据之后我们要将数据set到各种UI控件中去。但是坑爹的是,在子线程之中我们并不能更新UI,必须在主线程(又称UI线程)进行数据的set,因此我们又必须切换到主线程去做处理。这样一会儿子线程,一会儿主线程的切换处理,非常让人头疼,代码往往...
Handler.post(Runable),Runable是运行在主线程中的。
在Android中可以通过handler方法完成数据的线程间的传递,但一定要将handler得到的数据通过loop传递到主线程再更新UI吗?其实也可以直接使用handler设计的post方法进行实现,handler的post方法是在主线程运行的,可以直接进行UI的更新操作。rn   MainActivity的代码rnrnrnrnrnrnpublic class MainActivity exten
Windows主线程和子线程的关系
在Windows下最重要的两个概念,一个是进程,一个是线程。n先来说下进程和线程的关系,进程是静态的,它相当于一个存放数据的空间,是放在内存中的,可以理解为一个工厂。而线程是动态来执行线程中的代码的,相当于工厂中的工人。看到执行代码你可能就会想到CPU了,没错,线程就是存在于CPU上的。n每个进程必须要包含一个线程。这句话怎么理解了,工厂中没工人干活,那么工厂不就等于于一个废物?它有存在的意义
EventBus四种线程模式
    EventBus是我们在项目开发时常用的进程通信组件,其功能与广播类似,发送通知后改变UI或者进行其他的逻辑操作。在接收消息是有四种线程模式:POSTING、  MAIN、  BACGROUND、  ASYNC。1.POSTING:这个模式是EventBus默认的线程模式,跟发送消息是在同一个线程中,如果是在主线程发送的消息,接收也在主线程,如果是在子线程中发送的消息,那么接收也在同一个子...
主线程,子线程资源冲突,解决方案
问题描述,  我开发的任性动图软件,曾经遇到过这样的问题:nnn     任性动图有一个功能是涂鸦功能,就是将你的涂鸦过程生成动图,怎么实现的呢?n     有一个主显示内存,用以显示界面图像n     有一个辅显示内存,用以生成动图时,绘制动图nnn     因为要绘制涂鸦,所以n     开辟了一个涂鸦内存,将涂鸦绘制在这个内存上,然后再分别拷贝到主次内存上。nnn 因
android Looper demo
android 中利用 handler 1.主线程内消息发送。2.子线程向主线程发送消息。3.主线程向子线程发送消息
UI访问在主线程、耗时操作在子线程的原因
Android规定,访问UI只能在主线程中进行,若在子线程中进行UI访问,就会抛出异常。nnQ:系统为何要求不能在子线程中访问UI?nnA:Android的UI控件不是线程安全的,多线程并发的访问,可能造成UI控件不可预期的状态。nnQ:为何系统不对UI控件的访问加上锁机制呢?这样就可以多线程并发访问了。nnA:1.加上锁机制后,会使UI控件的访问逻辑变复杂;2.加锁之后,UI访问效率变低,因为锁...
主线程和子线程通信
默认情况下新增的线程是没有开启消息循环的(主线程除外,会默认创建Looper对象,开启消息循环)一般情况下都是子线程向主线程发送消息,主线程中已经默认实现了Looper的操作。只需要创建Handler 开启线程发送消息 主线程中接收消息处理就可以了Looper:消息队列(MessageQueue)的管家(Looper)。一个消息队列只有一个管家,但是Handler(工人)可以有多个。Looper管...
IntentService是如何在子线程运行的。
IntentService 是如何让服务运行在子线程的 nIntentService是一个继承Service的抽象类。public abstract class IntentService extends Service {n private volatile Looper mServiceLooper;n private volatile ServiceHandler mServi
android之postDelayed是否运行在主线程中解答
知识点n1、postDelayde是否运行在主线程中?答案是肯定的。rn代码如下rn在绝对的UI线程中打印线程ID:rnSystem.out.println("-=-=-=>>xianchengid00000 = " + Thread.currentThread().getId());下面在posdelayed中打印运行线程的ID:rnnew Handler().postDelayed(new R
C#/.NET主线程与子线程之间的关系
一般来说,一个应用程序就对应一个进程,一个进程可有一个或多个线程,只有一个主线程。nnnn主线程与子线程之间的关系nnn默认情况,在新开启一个子线程的时候,他是前台线程,只有将线程的IsBackground属性设为true;他才是后台线程n当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束n当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束n不管是前台
WPF 多线程---- 子线程操作界面主线程的元素
1 在代码中开启一个子线程 rnrn Thread cabService = new Thread(new ThreadStart(dataReceiver));n cabService.Start();每隔2s ,产生一个数据rn public void dataReceiver()n {n while
主线程和子线程之间传递消息
nnn<?xml version="1.0" encoding="utf-8"?>n<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"n android:layout_width="match_parent"n android:layout_height="match_pa
子线程与主线程之间的通信
1, 进程和线程rn通俗的讲, 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.rn进程和线程的主要差别在于它们是不同的操作系统资源管理方式。rn1,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。rn2,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等
代码技巧1监听器从子线程切换主线程
举个例子:rn在请求一个接口或者进行IO处理的时候,因为这都属于耗时行为,所以都要放到子线程中去,当处理完毕的时候,通常会回调一个接口,rn因为接口是在子线程中回调的,所以在回调的地方如果直接操作主线程中的控件会造成BUG。这个BUG我就不贴了。今天看FilerDownloader源码的时候,发现了一个巧妙的写法,就是在接口回调用也定义一个静态内部类,类中的方法就是接口中的方法,然后通过Handl
安卓handler的使用
handler的使用演示,主线程给子线程发消息,子线程给主线程发消息
Qt创建的子线程不断循环,主线程界面一直处于无响应状态
说明n今天用子线程处理数据,但只创建了子线程,还没有来得及让子线程处理大量的数据。在子线程只作了简单处理,发现主线程界面一直不能响应,在主线程让子线程参数isStop= true,也跳不出循环。nwhile(!isStop)n{n emit mySignal();n if(isStop)n break;n}nnn后来在子线程加入QThread::sleep(1);主线程就...
Future和FutureTask-获取子线程计算结果
nCallable、Future和FutureTask 配合使用,获取子线程计算结果。rn rn当主线程需要做一个耗时的计算时,可以启动一个子线程去处理,子线程处理同时主线程rn做自己的事情,当主线程需要子线程的计算结果时候,则取出计算结果,如果这时候子线程rn还没有处理完成,则主线程会处于等待状态rn rnpublic class FutureTest {rnrn public static v...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java新人学习 java新人学习感想