Android 多线程注意事项
参考:http://blog.csdn.net/x86android/article/details/14161981
http://geeksun.iteye.com/blog/1447708
Android中的线程
在Android平台中多线程应用很广泛,在UI更新、游戏开发和耗时处理(网络通信等)等方面都需要多线程。Android线程涉及的技术有:Handler;Message;MessageQueue;Looper;HandlerThread。
有一点要非常注意的,就是在写这个多线程代码的时候,遇到了两个错误:第一个是
android.os.NetworkOnMainThreadException异常;第二个是Only the original thread that created a view hierarchy can touch its views异常。
出现android.os.NetworkOnMainThreadException异常的原因是,在4.0以上Android中,访问网络不能在主线程中,否则会报错。出现第二个Only the original thread that created a view hierarchy can touch its views异常的原因是,Android中更新UI处理必须由创建它的线程更新,而不能在其他线程中更新,处理方法是通过message和handler的机制来刷新主线程UI。
正确代码如下:
package com.example.MyStarRss; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MyStarRssActivity extends Activity {
/**
* Called when the activity is first created.
*/ private TextView showTextView;
private String data = "";
private Handler handler; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); Button startDownload_button = (Button)findViewById(R.id.start_download);
showTextView = (TextView)findViewById(R.id.showdata_textview);
startDownload_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 启动下载任务
new Thread(downtask).start(); }
});
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 0:
showTextView.setText(msg.obj.toString());
}
}
}; } Runnable downtask = new Runnable() {
@Override
public void run() {
MyHttpDownLoader myHttpDownLoader = new MyHttpDownLoader("http://rss.sina.com.cn/ent/hot_roll.xml");
String mydata = myHttpDownLoader.starDownload_Text();
Message msg = new Message();
msg.obj = mydata;
msg.what = 0;
handler.sendMessage(msg);
}
}; }
通过代码可以看出,启动多线程后,子线程要通过message和handler来与主线程进行通信。子线程启动之后,在完成下载任务时会向handler发送一个message, 通知主线程下载已经完成,然后通过主线程来更新UI。
Android 多线程注意事项的更多相关文章
- java多线程以及Android多线程
Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使得宏观上具有多个线程或者进程同时执行的效果. 进程:在操作系统来说,一个运行的程序或者 ...
- android多线程-AsyncTask之工作原理深入解析(上)
关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...
- Android多线程(一)
在Android应用的开发过程中,我们不可避免的要使用多线程,获取服务器数据.下载网络数据.遍历文件目录查找特定文件等等耗时的工作都离不开线程的知识.Android继承了Java的多线程体系,同时又实 ...
- android 多线程
本章讲述在android开发中,多线程的应用.多线程能够处理耗时的操作并优化程序的性能.本章主要介绍知识点,AsyncTask,Java线程池,ThreadPoolExecutor线程池类.本章案例只 ...
- Android多线程分析之五:使用AsyncTask异步下载图像
Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...
- Android多线程分析之四:MessageQueue的实现
Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...
- Android多线程分析之三:Handler,Looper的实现
Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...
- Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一 ...
- Android多线程分析之一:使用Thread异步下载图像
Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android F ...
随机推荐
- 读underscore
最近在拜读只有1700行(含注释)代码的Underscore.js 1.9.1,记录一些东西 (参考https://underscorejs.org/underscore.js,https://git ...
- C++getline使用
C++getline使用 一.心得 getline(cin,s);多去看函数的使用默认说明 二.使用 getline(istream &in, string &s) 从输入流读入一行到 ...
- mysqldump恢复指定表
http://blog.csdn.net/lwei_998/article/details/18860889 如果mysql服务器上不能随意安装软件,当需要从全备份中恢复单个表,怎么办? 1.mysq ...
- delphi向SQL Server2005中存取图片
SQL Server2005中,我用image类型来存取图片,首先把数据库表设置好 例如我的pic表有如下两列:时间,图片. delphi中,我用ADOQuery来连接数据库,但是数据库中有好几张表, ...
- EM算法及其应用: K-means 与 高斯混合模型
EM算法及其应用(一) EM算法及其应用(二): K-means 与 高斯混合模型 上一篇阐述了EM算法的主要原理,这一篇来看其两大应用 -- K-means 与 高斯混合模型,主要由EM算法的观点出 ...
- PHP中实用的模式之【门面模式】
author:胡旭个人博客 blog:http://www.ihuxu.com 欢迎关注~~~~ 对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问 ...
- 工作中比较重要的经验分享-2016-bypkm
工作中总有一些经验能让人记忆深刻,能让人终生受用,相比技术而言,经验是宝贵的.无价的.在我的博客中,主要是技术类的博文,那些东西是相对死板的,价值也相对低廉.今天就记录一下我在工作中一次比较重要的经验 ...
- streamsets stream selector 使用
stream selector 就是一个选择器,可以方便的对于不同record 的数据进行区分,并执行不同的处理 pipeline flow stream selector 配置 local fs 配 ...
- 初识安卓小程序(Android短信发送器)
首先,先创建一个安卓项目(我的版本号是4.4.2的),名字为"短信发送器" 然后在res目录下找到layout目录,找到activity_main.xml或fragment_mai ...
- list_for_each与list_for_each_entry具体解释
一.list_for_each 1.list_for_each原型#define list_for_each(pos, head) \ for (pos = (head)->next, ...