作为Android开发的组成部分,多线程的作用举足轻重,先来说说应用场景

1多线程使用场景

1.1正常使用中,经常有子线程来更新界面UI的需求,但是安卓不允许子线程更新UI

使用子线程处理UI,若线程需要较长的时间,势必造成UI没有反应,从而导致程序ANR(Application is not responding),使用户体验很差。

1.2多线程执行的需求

与其他编程开发一样,多线程可以增加程序的并发性,提高程序吞吐能力。

2多线程开发模式

2.1使用AsyncTask

AsyncTask是Android框架提供的异步处理的辅助类,含有多个回掉接口,功能相当强大

2.2使用Handler

通过消息队实现线程间的通信,与Looper配合使用,相对于AsyncTask,具有更高的可塑性。

3上代码

public class UIHandler extends Handler{
private EditText mEditText = null;;
public UIHandler(EditText editText){
mEditText = editText;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String value = String.valueOf(msg.obj);
if(mEditText!=null){
mEditText.setText(value);
}
}
}

Handler子类的简单实现

public class UIAsyncTask extends AsyncTask<Integer, Void, Integer> {
@Override
protected void onCancelled() {
super.onCancelled();
} @Override
protected void onPreExecute() {
super.onPreExecute();
} @Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
} @Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
} @Override
public boolean equals(Object o) {
return super.equals(o);
} @Override
protected void finalize() throws Throwable {
super.finalize();
} @Override
public int hashCode() {
return super.hashCode();
} @Override
public String toString() {
return super.toString();
} private EditText mEditText = null; public UIAsyncTask(EditText editText) {
mEditText = editText;
} @Override
protected Integer doInBackground(Integer... param) {
return param[0]++;
} @Override
protected void onPostExecute(Integer result) {
mEditText.setText(String.valueOf(result));
}
}

AsynTask子类的简单实现

public class MainActivity extends Activity {
private EditText mEditText = null;
private UIHandler mHandler = null;
private UIAsyncTask mAsyncTask = null;
private int mCount = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) this.findViewById(R.id.txtTips);
mHandler = new UIHandler(mEditText);
mAsyncTask = new UIAsyncTask(mEditText);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} public void OnBtnHandlerClick(View v) {
Message msg = mHandler.obtainMessage();
msg.obj = mCount++;
mHandler.sendMessage(msg);
} public void OnBtnUIThreadClick(View v) {
this.runOnUiThread(new Runnable() {
public void run() {
mEditText.setText(String.valueOf(mCount++));
} });
} public void OnBtnViewPostClick(View v) {
//只能被执行一次,否则多次调用时将会出现异常;
new Thread(new Runnable() {
public void run() {
mEditText.setText(String.valueOf(mCount++));
}
});
} public void OnBtnAysncClick(View v) {
//只能被执行一次,否则多次调用时将会出现异常;
mAsyncTask.execute(mCount);
}
}

MainActivity的内容

<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">线程使用</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="info_tips">线程的使用</string>
<string name="info_show">等待线程返回信息</string>
<string name="handler_method">Handler方法</string>
<string name="uithread_method">UIThread方法</string>
<string name="uipost_method">ViewPost方法(只能执行一次)</string>
<string name="asynctask_method">AsyncTask方法(只能执行一次)</string>
</resources>

字符串定义

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/info_tips" /> <EditText
android:id="@+id/txtTips"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/info_show" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="OnBtnHandlerClick"
android:text="@string/handler_method" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="OnBtnUIThreadClick"
android:text="@string/uithread_method" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="OnBtnViewPostClick"
android:text="@string/uipost_method" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="OnBtnAysncClick"
android:text="@string/asynctask_method" /> </LinearLayout>

布局文件

4总结

时间比较仓促,写的不是很详细,哎!

Android学习三:线程操作的更多相关文章

  1. android学习日记09--BitMap操作

    Bitmap android里的图像处理重要的类,支持jpg.png.bmp等格式的图像,BitmapDrawable是封装Bitmap的一个对象,Bitmap实现在android.graphics包 ...

  2. Android学习之蓝牙操作

    BluetoothAdapter 用法 蓝牙运行原理:通过BluetoothAdapter 蓝牙适配器处理任务,如果蓝牙被启动之后,系统会自动去搜索其它设备,如果匹配到附近的设备就发送一个广播,Bro ...

  3. android学习-进程/线程管理-完整

    我们知道,应用程序的主入口都是main函数--"它是一切事物的起源" main函数工作也是千篇一律的, 初始化 比如ui的初始化,向系统申请资源等. 进入死循环 再循环中处理各种事 ...

  4. Android开发——子线程操作UI的几种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...

  5. Android学习之Image操作及时间日期选择器

    一.基础学习 1.ImageView是图片容器,就相当于RadioGroup是RadioButton的容器一样,是View的直接子类. 1: <ImageView 2: android:id=& ...

  6. android UI跨线程操作

    android应用程序也是单线程程序,主线程为UI线程. android 线程是非安全的,即不要在子线程中更新 UI. public class MasterActivity extends Acti ...

  7. Java多线程学习(三)---线程的生命周期

    线程生命周期 摘要: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞 ...

  8. git学习——<三>git操作

    一.创建仓库 创建一个目录 mkdir repository cd到该目录下,初始化该版本库 git init 至此,版本库创建成功,可以在该文件夹下看到.git文件夹,ls -ah可以看到该文件夹. ...

  9. openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等

    openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...

随机推荐

  1. Keycode对照表

    字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 ...

  2. ABAP之PINYING拼音

    前面说了声母韵母,那么现在来说说ABAP里的拼音——域,数据元素,结构 PINGGUO = 苹果 T-CODE : SE11   如下图 域:是一些特定值的集合,或者某一种特殊用途的集合.如:需要定义 ...

  3. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  4. 使用ASP.NET 上传文件 三种类型判断方法(后缀,MIME,数据流)

    #region 一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false; s ...

  5. OC语言description方法和sel

    OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...

  6. codeforces 451E Devu and Flowers

    题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为  s支花分到 ...

  7. [NOI2007 Day1] 货币兑换 Cash

    vijos P1508 / BZOJ 1492 膜拜了这么久的cdq分治,终于有机会亲自来写了.虽然这个思想很好理解,先做前一半,计算前一半对后一半的影响,再做后一半.但是由于我这个傻Ⅹ,以前既没有做 ...

  8. [vijos P1391] 想越狱的小杉

    考前最后一题,竟然是第一次码SPFA,虽然这个算法早有耳闻,甚至在闻所未闻之前自己有过一个类似的想法,说白了就是广搜啊,但是敲起来还是第一次啊,而且这还不是真正意义上的SPFA. 完全按照自己想法来码 ...

  9. ConvertFrom-String 命令研究

    -------先上个例子------- $aaa = @'0.027 0.034 0.834 0.1050.346 0.558 0.018 0.0780.001 0.997 0.001 0.0010. ...

  10. CPU指令系统

    CPU就是通过指令系统来操控寄存器然后实现读取数据的,所以我们必须介绍一下CPU的指令系统 如果我们知道指令的英文全称,这对我们理解指令的作用有很大帮助,所以贴出指令英文全称 接下来就是介绍一些主要的 ...