Android 操作UI线程的一些方法
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。
模拟耗时操作
private void connectNet() throws InterruptedException {
Thread.sleep(2000);
}
方法一:Handler
子线程中通过Handler的sendMessage(msg)发送事件:
private void method1() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
//向Handler发送消息
mHadndler.sendEmptyMessage(111);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
方法二:View.post(Runnable)
private void method2() {
myText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
myText.post(new Runnable() {
@Override
public void run() {
myText.setText("联网结束,更新UI数据");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
方法三:Activity.runOnUiThread
与view.post类似
private void method3() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
runOnUiThread(new Runnable() {
@Override
public void run() {
myText.setText("runOnUiThread...");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
方法四:AsyncTask
private void method4() {
//UI线程中执行
new LoadTask().execute("www.91dota.com");
}
private class LoadTask extends AsyncTask {
protected void onPostExecute(String result) {
myText.setText(result); //得到来自网络的信息刷新页面
}
protected String doInBackground(Object[] objects) {
return "......";//后台耗时操作
}
}
===========================》
附上代码和布局
MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView myText;
private Handler mHadndler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
myText.setText("收到消息啦..." + msg.what);
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myText = findViewById(R.id.myTextView);
} /**
* 方法一:Handler
*/
private void method1() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
//向Handler发送消息
mHadndler.sendEmptyMessage(111);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
} /**
* 方法二:通过View.post(Runnable)
*/
private void method2() {
myText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
myText.post(new Runnable() {
@Override
public void run() {
myText.setText("联网结束,更新UI数据");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
} /**
* 方法三:Activity.runOnUiThread(Runnable )
*/
private void method3() {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
//耗时操作
connectNet();
myText.setText("runOnUiThread...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} /**
* 方法四:AsyncTask
*/
private void method4() {
//UI线程中执行
new LoadTask().execute("www.91dota.com"); }
private class LoadTask extends AsyncTask {
protected void onPostExecute(String result) {
myText.setText(result); //得到来自网络的信息刷新页面
}
protected String doInBackground(Object[] objects) {
return "......";//后台耗时操作
}
} private void connectNet() throws InterruptedException {
Thread.sleep(2000);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:id="@+id/myTextView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="10dp"
android:background="#dea"
android:gravity="center"
android:text="Hello World!" /> </LinearLayout>
参考:http://www.it165.net
Android 操作UI线程的一些方法的更多相关文章
- Android 关于操作UI线程
在非UI线程里访问 Android UI toolkit—这个在一个worker线程修改了 View .这会导致不可预期的结果,而且还难以调试. 为了修复这个问题,Android提供了几个方法从非UI ...
- 转:探讨android更新UI的几种方法
本文转自:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
- Android 更新UI的两个方法
Android 更新UI的两个方法 在Android的开发过程中,常常需要适时的更新UI.Androd中的UI是在主线程中更新的.如果在主线程之外的线程中直接更新,就会出现报错并抛出异常: andro ...
- 【转】探讨android更新UI的几种方法----不错
原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
- 探讨android更新UI的几种方法
作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...
- 探讨android更新UI的几种方法(转)
作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- Android开发——子线程操作UI的几种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...
- Android中UI线程与后台线程交互设计的5种方法
我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必 ...
随机推荐
- linux:ubuntu安装mysql(二)--推荐
1)下载mysql安装包mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz,下载地址:https://dev.mysql.com/downloads/mysql/ 2 ...
- VMware虚拟机上配置nginx后,本机无法访问问题
nginx装在CentOS上,用本机访问虚拟机的时候却出现了不能访问的问题,查了资料以后,原来是防火墙的问题.具体情况如下:防火墙可以ping通虚拟机,虚拟机也可以ping通防火墙.接着检查了服务器端 ...
- linux安装python3 ,安装IPython ,安装jupyter notebook
安装python3 下载到 /opt/中 1.下载python3源码,选择3.6.7因为ipython依赖于>3.6的python环境wget https://www.python.org ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- WPF Blend 一个动画结束后另一个动画开始执行(一个一个执行)
先说明思路:一个故事版Storyboard,两个双精度动画帧DoubleAnimation. 一个一个执行的原理:控制动画开始时间(例如第一个动画用时2秒,第二个动画就第2秒起开始执行.) XAML: ...
- tomcat的一次请求过程
Tomcat处理一个HTTP请求的过程 假设来自客户的请求为: http://tomcat.com/yy/index.jsp 首先 dns 解析tomcat.com机器,一般是ng服务器ip地址 然后 ...
- 20165205 2017-2018-2 《Java程序设计》 第三周学习总结
20165205 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 学习类的概念(类体,成员变量,方法) 学会构造方法(默认和自定义构造方法) 学会创建.使用对 ...
- 循环内部嵌套ajax请求
循环内部ajax请求涉及到循环变量的取值问题: 例如: for(var i=0; i<items.length; i++){ zzurl = items[i].url; $.ajax({ typ ...
- python 读取bin文件
python读取bin文件并下发串口 # coding:utf-8import time, serialfrom struct import *import binascii file = ope ...
- 【转】不联网如何PING通WIN主机和VMWARE
原文地址:http://www.gqgtpc.com/thread-76838-1-1.html 一般情况下,如果宿主主机的网口连接网线并且能够上网,那么按照VM的默认安装,在VM-Settings- ...