Android中的多线程编程(一)附源码
来源:互联网 发布:mac pro 风扇声音很大 编辑:程序博客网 时间:2024/06/05 16:44
Android中多线程编程:Handler类、Runnable类、Thread类之概念分析
1.Handler类:
Handler是谷歌封装的一种机制:可以用来更新UI以及消息的发送和处理。Handler是运行在主线程(UI线程)。
(2).使用Handler机制的原因:
这是谷歌封装的一种更新UI机制和消息机制,如果不使用这个来更新UI和发送处理消息的时候就会抛出异常。
(3).Handler的使用:
Handler发送消息其实是发送给自己。也就是说由自己来进行发送和处理。是因为Handler内部和Looper相关联。
A.更新UI界面方面:
package com.chengdong.su.handlerdemo;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.os.Build;/** * Handler用途1:更新UI界面中的组件 * * @author scd * */public class MainActivity extends Activity { private ImageView mView; /** 数据源 */ private int[] mImage = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3 }; /** 图片所在的位置 */ private int mIndex = 0; /** the object of the Handler */ private Handler mHandler = new Handler(); /** the object of the Runnable */ private MyRunnable mRunnable = new MyRunnable(); Runnable runnable = new Runnable() { @Override public void run() { mIndex++; mIndex = mIndex % 3; mView.setImageResource(mImage[mIndex]); // 再次调用Runnable对象,每隔一秒钟调用一次run()方法 mHandler.postDelayed(runnable, 1000); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); init(); // 方法一: // mHandler.postDelayed(runnable, 1000); // 方法二:自定义Runnable对象 mHandler.postDelayed(mRunnable, 1000); } /*** * init the view */ private void init() { mView = (ImageView) findViewById(R.id.imageView1); } /** * 任务:业务逻辑 * * @author scd * */ private class MyRunnable implements Runnable { @Override public void run() { mIndex++; mIndex = mIndex % 3; mView.setImageResource(mImage[mIndex]); // 再次调用Runnable对象,每隔一秒钟调用一次run()方法 mHandler.postDelayed(mRunnable, 1000); } }}
B.消息处理方面:
package com.chengdong.su.handlerdemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.widget.ImageView;/** * Handler用途1:更新UI界面中的组件 * * @author scd * */public class MainActivity extends Activity { private String TAG = "MainActivity"; private boolean Flag; private ImageView mView; /** the object of the Handler */ private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: { mView.setImageResource(R.drawable.ic_1); Log.d(TAG, "消息1"); break; } case 1: { mView.setImageResource(R.drawable.ic_2); Log.d(TAG, "消息2"); break; } default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); init(); if (Flag) { mHandler.sendEmptyMessage(0); } else { mHandler.sendEmptyMessage(1); } } /*** * init the view */ private void init() { mView = (ImageView) findViewById(R.id.imageView1); }}
2.Runnable类:
Runnable类是在UI线程中运行的,并没有创建新的线程。Runnable类是一个接口,通过覆写该类中的run()方法来实现业务逻辑需求。来更新UI界面中的组件。Runnable类只是一个任务接口。是开启的线程的执行的任务。
3.Thread类:
实现Runnable类中的run()方法,Thread类调用该run()方法来运行新开启的线程,线程需要执行的内容都在该run()方法中来完成。
(1).start()方法:该方法启动一个线程。但是此线程是处于就绪状态,并没有运行。然后通过Thread系统类自动调用run()方法来完成运行操作。
(2).run()方法:该方法成为线程体。包含了要执行的线程的内容。run()方法运行结束,此线程终止。
package com.chengdong.su.handlerdemo;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import android.os.Build;/** * * @author scd * */public class SecondActivity extends Activity { private String TAG = getClass().getSimpleName(); private TextView mView; private MyThread mThread; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { Log.d(TAG, "Thread UI:" + Thread.currentThread().getId()); mView.setText("111"); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); System.out.println("--->UI线程:" + Thread.currentThread().getId()); // 方法一: new Thread() { public void run() { System.out .println("--->新的线程:" + Thread.currentThread().getId()); }; }.start(); // 方法二: new Thread(new Runnable() { @Override public void run() { System.out .println("--->新的线程:" + Thread.currentThread().getId()); } }).start(); } private void init() { mView = (TextView) findViewById(R.id.textView1); } class MyThread extends Thread { public Handler mHandler2; @Override public void run() { // 创建一个消息载体对象 Looper.prepare(); mHandler2 = new Handler() { public void handleMessage(android.os.Message msg) { Toast.makeText(getApplicationContext(), "111", 1).show(); }; }; // 循环机制 Looper.loop(); } }}
总结:
Runnable()只是一个任务的抽象,并不是多线程。Thread.start()才是新开一个多线程。并且在新开的线程执行Thread,执行run()方法。多线程是Thread实现,跟Runnable没有太大关系。线程就是为了更好地利用CPU,提高程序运行速率的!
- Android中的多线程编程(一)附源码
- Android中的多线程编程(二)Handler的原理(附源码)
- Android中多线程编程(四)AsyncTask类的详细解释(附源码)
- Android中的SharedPreference存储(附源码)
- Android/java http多线程断点下载(附源码)
- Java中的多线程编程(一)
- Android应用面向Holder编程,附源码
- win32.多线程程序设计(内附源码)
- Android 俄罗斯方块(附源码)
- 下载Android 5.0源码(附源码)
- WIN32下DELPHI中的多线程【深入VCL源码】(一)
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- android网络编程 -- Socket 通信(03) 点对点Android聊天室实现(带服务器) [附源码分析]
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码
- 鼠标经过三维物体时放大并旋转,离开时停止旋转,恢复到原来大小
- KMP模板
- 黑马程序员——Java基础-多线程
- HDU5299拓扑排序和博弈
- 读《沃伦巴菲特》有感
- Android中的多线程编程(一)附源码
- archive log文件大小与redo log文件大小关系探究
- 基类与派生类的关系
- &与&&的区别
- 哈理工 oj 2122 旅行(map + 最短路dij算法)
- kafka
- 第六章循环笔记
- 图搜算法
- Simpsons’ Hidden Talents(KMPnext[]的应用)