对JAVA的线程相信大家都有一定的认识,本篇就让我们一起探讨一下Android中的线程问题,对于线程和进程的区别我就不再赘述,有兴趣的小童鞋可以百度一下,讲解的非常详细,相信大家经常可以听到关于线程的东西。下面我们就一起来学习一下吧。

  为什么要了解Android的线程机制呢?因为谷歌为了提高Android安全些,要求Android4.0以后的版本,需要网络访问时,要声明一下。我们都知道网络访问是个费时的操作,所以我们需要把网络访问添加到子线程处理,然后把子线程的数据传到主线程进行显示。

  下面我以一个简单的例子为大家介绍一下为什么子线程不能进行视图的更新:

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview); /*
* 子线程不能进行视图的更新
*/
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
textview.setText("更新视图");
}
}).start();

  }

  这样操作就会导致系统强退:

  

  Locat打印的错误日志:

  

  出现这个错误的原因就是因为子线程不能进行UI界面的更新,UI界面的更新必须在主线程中进行,所以这就要说的是如何从子线程回到主线程呢?方法其实很简单,下面我们就一起看两种方式,完成上面的UI界面更新。

  方法一:通过runOnUiThread(new Runnable(){});实现:

        //更新视图方法一:
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
//返回主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText("更新视图方法一");
}
});
}
}).start();

  这样我们的UI界面就完成了更新。

  方法二:通过Handler类来实现:

  首先我们需要创建一个Handler对象,通过这个对象来进行UI界面的更新。

  

//创建Handler对象
private Handler handler = new Handler();
        //更新视图方法二:
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(3000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() { @Override
public void run() {
textview.setText("更新视图方法二");
}
});
}
}).start();  

  这两中方法都十分的强大,我个人比较喜欢第一种方法,不过通过Handler进行UI界面的更新十分的强大,在随后的几篇总结中,我将为大家介绍Handler在处理线程问题时的方法与强大。如果你对此感兴趣可以持续关注更新。

Android线程处理的更多相关文章

  1. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  2. Android线程管理之Thread使用总结

    前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...

  3. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  4. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  5. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  6. Android线程之主线程向子线程发送消息

    和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...

  7. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  8. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  9. android 线程学习

    很多人觉得线程难理解,主要有两个问题: 线程休眠,既然线程已经休眠了,程序的运行速度还能提高吗? 线程体一般都进行死循环,既然线程死循环,程序就应该死掉了,就会没有反应. 1.关于线程休眠问题 对线程 ...

  10. Android 线程模型

    Android 线程模型 1. import android.os.Handler;  import android.os.Message; public class MainActivity ext ...

随机推荐

  1. 在wifi状态下没有数据线,链接手机调试

    因为不知道是手机的问题还是数据线的问题,经常链接不上adb 所以找了一下wifi情况下,无线跟eclipse链接调试 第一步,首先你需要在你的手机上安装一个终端模拟器工具 第二步,在终端里输入(需要r ...

  2. C2第八次解题报告

    看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...

  3. Linux终端杀手、程序员利器-Tmux

        Send article as PDF      SA.Coder.经常远程.还在开一堆终端?试试 Tmux 吧,一个窗口就搞定. 目录 0.0.0.1 Tmux ? Tmux 是一个终端复用 ...

  4. Dom4j 对XMl解析 新手学习,欢迎高手指正

    废话不多,先看代码 public static void main(String args[]){ ReaderXml("d:/example.xml");//读取XML,传入XM ...

  5. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  6. 打开mysql时,提示 1040,Too many connections

    打开mysql时,提示 1040,Too many connections,这样就无法打开数据库,看不了表里边的内容了. 出现这个问题的原因是,同时对数据库的连接数过大,mysql默认的最大连接数是1 ...

  7. 将Win8.1/WP8.1应用迁移到Universal Windows Platform

    在上一篇在VS2015 RC打开CTP中创建的工程,我们介绍了怎么在RC中打开CTP中创建的Universal 工程,这一篇我们来讲下怎么将Windows 8.1/WP8.1的应用迁移到Univers ...

  8. 一天一小段js代码(no.4)

    最近在看网上的前端笔试题,借鉴别人的自己来试一下: 题目: 写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推. 有一 ...

  9. GOOGLE PROTOBUF开发者指南

    原文地址:http://www.cppblog.com/liquidx/archive/2009/06/23/88366.html 译者: gashero 目录 1   概览 1.1   什么是pro ...

  10. 用C表达面向对象语言的机制2——颠覆你对方法调用的看法!

    用C表达面向对象语言的机制2——颠覆你对方法调用的看法! 源代码在文末.推荐阅读本文PDF版,格式更好看. 在上一篇<用C表达面向对象语言的机制——C#版>中,我们获知了如何用C表达面向对 ...