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 ...
 
随机推荐
- 雷林鹏分享:Ruby CGI Sessions
			
Ruby CGI Sessions CGI::Session 可以为用户和CGI环境保存持久的会话状态,会话使用后需要关闭,这样可以保证数据写入到存储当中,当会话完成后,你需要删除该数据. #!/us ...
 - mysql 常见数据类型
			
---恢复内容开始--- MySQL常见的数据类型 一.数据类型是什么? 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 有一些数据是要存储为 ...
 - Leetcode 51
			
//看了一次解析后,一次AC,用一个pos记录行列.class Solution { public: vector<vector<string>> solveNQueens(i ...
 - HashMap1.8源码分析(红黑树)
			
转载:https://segmentfault.com/a/1190000012926722?utm_source=tag-newest https://blog.csdn.net/weixin_40 ...
 - Loops with PL/SQL
			
1. Basic loop loop /* statements */ end loop; 2. While loop while a > b loop /* statements */ end ...
 - 12.19    redis缓存
			
---恢复内容开始--- 命中:应用程序从key中获取数据,取到后返回 失效:到设置的失效时间后就失效 更新:应用程序把数据存到数据库中后又放回去 在项目中使用redis方法 结合业务场景,避免滥用 ...
 - facade外观模式
			
通过买股票与通过基金买股票引出外观模式: package com.disign.facade; /** * Created by zhen on 2017-05-18. */ public class ...
 - New Concept English Two 3
			
$课文5 无错号之虞 47. Mr.James Scott has a garage in Silbury and now he has just bought another garage in P ...
 - /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void
			
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std ...
 - NET Core的代码安全分析工具 - Security Code Scan
			
NET Core的代码安全分析工具 - Security Code Scan https://www.cnblogs.com/edisonchou/p/edc_security_code_scan_s ...