转:http://blog.sina.com.cn/s/blog_3fe961ae0100mvc5.html 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常: ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original…
android 子线程中不能够更新ui已经根深蒂固在我的脑海里,当时也就理所当然的觉得子线程中也是不能够进行界面的跳转的,可是在后来的学习中,发现居然是能够通过子线程来进行activity的跳转时,立刻把我给震惊了.赶紧滚去写代码測试了下.结果真的能够.顿时泪奔.特此记录一下.与君共勉 activity: package com.example.testchildthreadgootheractivity; import android.app.Activity; import android.…
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:Message.obtain(what) Handler Handler是Message的处理器,同时也负责消息的发送和移除工作 发送即时消息:即使发送即时处理 发送延时消息:即时发送,过一会儿处理 MessageQueue:消息队列 用来存放通过Handler发送的消息,它是一个按Message的w…
UI 只能在主线程内更新,子线程需要更新UI组件时可以这样: fun fuck(){ Executors.newSingleThreadExecutor().execute{ // url request ... val visibility = View.VISIBLE Handler(mainLooper).post { val btn = findViewById<Button>(R.id.button) btn.visibility = visibility } } Thread{ p…
开发Android这么久了,总会听到有人说:主线程不能访问网络,子线程不能更新UI.Android的主线程的确不能长时间阻塞,但是子线程为什么不能更新UI呢?今天把这些东西整理,顺便在子线程更新UI. 首先写了一个handler在子线程更新主线程UI,在子线程做了一个耗时操作:从网络下载了一个图片并利用handler发送到handleMessage()的回调中,并更新到主线程的bitmap.图片显示成功,没有问题.接下来在子线程中更新onCreate()中实例化的textview,报错: and…
假设有一个activity,activity中有一个Button和一个TextView,点击按钮,弹出Dialog,对话框中有一个ListView,选中ListView中的某一项,关闭对话框,更新activity中EditText的值为你选中项的值. 分析这个问题,假设Dialog为AlertDialog,你可以直接在Button的OnClickListener事件中创建Dialog,并在AlertDialog的setPositiveButton或其他按钮监听器中完成对EditText值的更新:…
MainActivity如下: package cc.testui2; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * 在子线程中更改UI的方式二…
MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /*…
今天在做练习时,在一个新开启的线程中调用“Toast.makeText(MainActivity.this, "登陆成功",Toast.LENGTH_SHORT).show();” 报错为:Can't create handler inside thread that has not called Looper.prepare() 在新线程中添加Looper.prepare();和Looper.loop();即可. 示例代码段:(该代码在新开的线程中) Looper.prepare()…
第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里运行你要想的操作 比方直接在这里更新ui或者调用回调在 在回调中更新ui } }); context是你传过来的context对象 另外一种: // 假设当前线程是UI线程,那么行动是马上运行.假设当前线程不是UI线程,操作是公布到事件队列的UI线程 // 由于runOnUiThread是Activ…