博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android学习系列18]线程,进程,异步的一些事
阅读量:4550 次
发布时间:2019-06-08

本文共 3681 字,大约阅读时间需要 12 分钟。

粗俗理解:

线程安全和非线程安全:   一样东西(变量或代码),可以同时被多个线程操作修改,可是一个线程还没搞完它,另一个线程又插进来搞,就会出错,就不安全。

所以一个办法是,一个线程在搞它的时候,确保自己搞完以后其他线程才能进来搞,这样就叫线程安全。

 

 

 

android的UI操作只能由主线程(UI线程)来搞,但是有时候我们要从网络等地方获取数据等操作会开启另一个线程,同时这个数据又要更新到界面里,怎么办?(子线程不能修改UI)

第一种实现:  new一个thread,然后在thread的runnable里面获取数据,然后发消息和数据 给主线程的handler,让handler去更新界面

public class ActivityMain extends Activity { TextView textview; Button bt1; Handler handler; String textcontent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = (TextView)findViewById(R.id.textview1); textview.setText("更新前"); bt1 = (Button)findViewById(R.id.button1); handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //等通知过来 我就更新界面 textview.setText(textcontent); } }; bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //启动一个线程 假设这个线程是用来更新获取数据的 new Thread( new Runnable() { @Override public void run() { //这里是子线程 //假设这里已经从网络获取了数据 //textview.setText("更新后的数据"); //这样不行 报一个 only original thread can xxx 的错 textcontent = "更新后的数据"; //通知主线程的handler去更新 handler.sendEmptyMessage(0); } }).start(); } }); }}
View Code

 

第二种实现:  使用runOnUiThread

public class ActivityMain extends Activity { TextView textview; Button bt1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = (TextView)findViewById(R.id.textview1); textview.setText("更新前"); bt1 = (Button)findViewById(R.id.button1); bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //启动一个线程 假设这个线程是用来更新获取数据的 new Thread( new Runnable() { @Override public void run() { //这里是子线程 //假设这里已经从网络获取了数据 //textview.setText("更新后的数据"); //这样不行 报一个 only original thread can xxx 的错 // 用runOnUiThread方法里面的Runnable 相当于主线程(UI线程) runOnUiThread( new Runnable() { public void run() { textview.setText("更新后的数据"); //感觉好多了 } }); } }).start(); } }); }}
View Code

 

第三种实现:

 

 

 

解决NetworkOnMainThreadException

 

 

 

参考:

 

Android更新UI的两种方法——handler与runOnUiThread()

探讨android更新UI的几种方法

 

 

转载于:https://www.cnblogs.com/sleeptothedeath/p/3699274.html

你可能感兴趣的文章
Centos7系统环境下Solr之Java实战(二)制定中文分析器、配置业务域
查看>>
javascript面向对象与原型
查看>>
译|调整JavaScript抽象的迭代方案
查看>>
[转载]Xcode创建的默认iOS OpenGL ES 2.0 project代码分析
查看>>
c#解决窗体假死的一种方法
查看>>
基于事件的JS
查看>>
windows 上的 neovim 配置
查看>>
THINKING IN JAVA 学习笔记(四)
查看>>
作为一名.NET工程师应该具备哪些技能呢?
查看>>
const,static,extern用法总结
查看>>
floor函数 并利用floor函数实现四舍五入功能
查看>>
hdu 4454 Stealing a Cake
查看>>
python_69_内置函数1
查看>>
在linux环境下为eclipse配置jdk以及Tomcat服务(附图解详细步骤)
查看>>
python_53_函数补充
查看>>
二分查找
查看>>
HDU 1035 Robot Motion
查看>>
hdu 5853 Jong Hyok and String(广义后缀自动机)
查看>>
JS实现动画原理一(闭包方式)
查看>>
互评作业:使用数组
查看>>