Android多线程编程方法及开启步骤

  

  作者:华清远见讲师

  实现线程的两种方式

  使用继承的方法

  class MyThread extends Thread{

  @Override

  public void run(){

  //处理具体的逻辑

  }

  }

  要启动这个线程,在主线程中新建一个该实例,调用其start()方法即可。

  使用实现Runnable借口的方式

  class MyThread implements Runnable{

  @Override

  public void run(){

  //处理具体的逻辑

  }

  }

  开启现成时,使用:

  MyThread myThread = new MyThread();

  new Thread(MyThread).start();

  匿名类的方法去实现Runnable也是一样的

  new Thread(new Runnalbe(){

  @Override

  public void run(){

  //处理具体逻辑

  }

  }).start();

  异步操作

  和很多的GUI库一样,Android的UI也是线程不安全的,所以,我们不能在子线程中更新UI元素。

  我们需要通过异步的操作通过子线程向主线程通信的方式来将UI更新的操作交给主线程来完成。

  Handler和Message结合传递的方法

  这里,有Message、Handler、MessageQueue和Looper在作用。

  1、Message是县城之间传递的消息。

  2、Handler是处理者,用于发送和处理消息

  3、MessageQueue是消息队列的意思,存放通过Handler发送的消息。

  4、Looper是每个线程中的MessageQueue的管家。

  Handler handler = new Handler(){

  public void handleMessage(Message msg){

  switch (msg.what){

  case UPDATA_TEXT:

  txvHello.setText("Nice to meet you!");

  break;

  default:

  break;

  }

  }

  };

  8new Thread(new Runnable() {

  @Override

  public void run() {

  Message msg = new Message();

  msg.what = UPDATA_TEXT;

  handler.sendMessage(msg);

  }

  }).start();

  使用Async Task

  Async Task是一个抽象类,我们要使用它,就要先对他进行处理。

  3个参数:

  1、Params在执行AsyncTask时需要传入的参数,可用于在后台服务中使用。

  2、Progress如果需要在界面上显示当前的进度,使用这里的泛型作为进度单位。

  3、Result任务执行完毕后,对结果进行返回。

  4个重写的方法:

  1、onPreExecute()

  2、DoInBackground(。。。)

  3、onProgressUpdate(。。。)

  4、onPostExecute(Result)

  public class DownloadTask extendsAsyncTask{

  TextView txvDownloading;

  ProgressBar progressBar;

  @Override

  protected void onPreExecute() {

  super.onPreExecute();

  progressBar.setMax(100);

  }

  public DownloadTask(TextView txvDownloading, ProgressBar progressBar) {

  this.txvDownloading = txvDownloading;

  this.progressBar = progressBar;

  }

  @Override

  protected Integer doInBackground(Void... params) {

  int count = 0;

  for (int i =100; i > 0; i-- ){

  count++;

  publishProgress(count);

  try {

  Thread.sleep(500);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  return count;

  }

  @Override

  protected void onProgressUpdate(Integer... values) {

  int a = values[0];

  Log.d("TAG",a+"");

  progressBar.setProgress(a);

  }

  @Override

  protected void onPostExecute(Integer integer) {

  super.onPostExecute(integer);

  if(integer.equals(100)){

  txvDownloading.setText("Done");

  }else{

  txvDownloading.setText("downloading");

  }

  }

  }

  在Mainactivity中只需要写入:

  1new DownloadTask(txvShow, prgsDownload).execute();

  即可。

  服务

  什么是服务:服务是Android的四大组件之一,在后台运行

  创建服务

  创建一个继承Service的类,

  其中onBind方法是默认重写的,其他的还有3个重要的方法,onCreate()、onStartCommand()、onDestroy()。

  1、onCreate()方法会在服务创建的时候调用

  2、onStartCommand()会在每次服务启动的时候调用

  3、onDestroy()会在服务销毁的时候调用。

  每个服务都必须在AndroidManifest.xml中注册才能生效。

  启动和关闭服务

  通过Intent我们可以来开启和关闭服务

  switch (v.getId()){

  case R.id.btn_start:

  Intent startTntent = new Intent(this, MyService.class);

  startService(startTntent);

  break;

  case R.id.btn_stop:

  Intent stopIntent = new Intent(this, MyService.class);

  stopService(stopIntent);

  break;

  default:

  break;

  }

  onBind方法,绑定服务

  private DownloadBinder mBinder = new DownloadBinder();

  class DownloadBinder extends Binder{

  public void startDownload(){

  Log.d("TAG","StartDownload");

  }

  public int getProgress(){

  Log.d("TAG","getProgress executed");

  return 0;

  }

  }

  @Nullable

  @Override

  public IBinder onBind(Intent intent) {

  return mBinder;

  }

  private ServiceConnection connection = newServiceConnection() {

  @Override

  public void onServiceConnected(ComponentName name, IBinder service) {

  downloadBinder = (MyService.DownloadBinder) service;

  downloadBinder.startDownload();

  downloadBinder.getProgress();

  }

  @Override

  public void onServiceDisconnected(ComponentName name) {

  }

  };

  case R.id.btn_bindstart:

  Intent bindIntent = new Intent(this, MyService.class);

  bindService(bindIntent,connection,BIND_AUTO_CREATE);

  break;

  case R.id.btn_bindstop:

  unbindService(connection);

  服务器的生命周期:

  略。

  更多的服务---前台服务

  类似于通知的使用方法,在onCreate代码中构建Notification对象,建立Intent对象,PendingIntent,setLatestEventInfo,接下来是startForeground方法

  public void onCreate() {

  super.onCreate();

  Notification notification =
newNotification(R.drawable.ic_launcher,"Notification
comes",System.currentTimeMillis());

  Intent notificationIntent = new Intent(this, MainActivity.class);

  PendingIntent pendingIntent =
PendingIntent.getActivity(this,0,notificationIntent,0);

  startForeground(1,notification);

  }

  7. IntentService

  为了避免在主线程中出现耗时逻辑,我们需要使用Android的多线程编程的方法,将耗时逻辑放入线程中进行。

  @Override

  public int onStartCommand(Intent intent, int flags,int startId) {

  new Thread(new Runnable() {

  @Override

  public void run() {

  //处理耗时逻辑

  }

  }).start();

  return super.onStartCommand(intent, flags, startId);

  }

  在耗时逻辑执行完成了之后,如果我们希望服务在处理完这些内容之后就自动关闭,呢么在耗时逻辑的最后加上stopSelf()方法是个不错的选择。

  当然这里要可以使用IntentService类,它可以简单的创建一个异步的,会自动停止的服务。

  public class MyIntentService extends IntentService{

  /**

  * Creates an IntentService. Invoked by your subclass‘s constructor.

  *

  *

  */

  public MyIntentService() {

  super("MyIntentService");

  }

  @Override

  protected void onHandleIntent(Intent intent) {

  for (int a = 10; a > 0; a--){

  try {

  Thread.sleep(500);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  Log.d("TAG", ""+a);

  }

  }

  @Override

  public void onDestroy() {

  super.onDestroy();

  Log.d("TAG", "onDestroy");

  }

  }

  ase R.id.btn_intentservice:

  Intent intentService = newIntent(this,MyIntentService.class);

  startService(intentService);

  break;

  

  >>>更多优秀技术博文请在华清远见嵌入式学院查看

时间: 2024-10-15 06:07:00

Android多线程编程方法及开启步骤的相关文章

Android多线程编程(一)——多线程基础

什么是进程 一个进程是一个独立(self contained)的运行环境,它可以看作一个程序或者一个应用. 什么是线程 而线程是进程中执行的一个任务,Java运行环境是一个包含了不同累和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. Android线程 Android的线程,实际上和Java的多线程编程并没有什么本质上的不同.当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如

android: 多线程编程基础

9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行. 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务 时所在的应用程序进程.当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停 止运行. 另外,也不要被服务的后台概念所迷惑,实际上服务并不会

iOS中有3种常见的多线程编程方法

1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC实现的.NSOperation以面向对象的方式封装了需要执行的操作,然后可以将这个操作放到一个NSOperationQueue中去异步执行.不必关心线程管理.同步等问题. 3.Grand Centeral Dispatch 简称GCD,iOS4才开始支持,是纯C语言的API.自iPad2开始,苹果设备开始有了双核CPU,为了充分利用这

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

Android 多线程编程初探

Android 中的多线程其实就是 JavaSE 中的多线程,只是为了方便使用,android 封装了一些类,如 AsyncTask.HandlerThread 等,在日常的开发过程中,我们往往需要去执行一些耗时的操作,例如发起网络请求,考虑到网速等其他外在的因素,服务器可能不会立刻响应我们的请求,如果不将这条操作放到子线程中去执行,就会造成主线程被阻塞,今天我们就从多线程的基础来一起探讨 一.线程的基本用法   对于 Andorid 多线程来说我们最新接触到的就是 Thread 和 Runna

android ——多线程编程

1.定义一个线程只需要新建一个类继承自Thread.然后重写run()方法,并在里面编写耗时逻辑即可: class MyThread extends Thread{ public void run(){ //处理具体的逻辑 } } 启动的时候只需要new出MyThread的实例,然后调用它的start()方法,这样run()中写的代码就会在子线程中进行: new Mythread().start(); 2.更多时候使用实现Runnable接口的方式来定义一个线程 class MyThread i

Android多线程编程

一.线程的三种使用方法 1.新建一个类继承自Thread,然后重写父类的run()方法,在run()方法中编写耗时逻辑,如下所示: class MyThread()extends Thread{ @Override public void run(){ //耗时操作 } } 开启这个线程的方法:new出这个MyThread类的实例,调用strart()方法,new  MyThread().start() 2.新建一个类实现Runnable接口的方式定义一个线程,如下所示: class MyThr

Android——多线程编程练习题

随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实现. layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

Android开发实践:多线程编程小结

我们知道,Android系统为了提高程序的实时响应能力,不允许在UI线程中进行耗时的操作,否则会出现ANR异常,因此必须将耗时的任务放到非UI线程中执行.Android/Java提供了很多类来帮助大家完成异步操作,比如:Thread类,Timer类,AsyncTask类,HandlerThread类,以及Executor接口.这些类都分别在什么场合下使用呢? 本文简单地总结一下Android开发中常见的多线程类型和解决方案,并比较和分析了各个方案的区别,以便更好地理解和应用这些API接口. 1.