`
huangqinqin
  • 浏览: 365755 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

android系统中的多线程(一): 关于在android中启动线程以及线程间的交互

 
阅读更多
在android中,一个应用开始运行的时候,系统将创建一个线程名为main,同时也称作UI thread.同一进程中的所有组件都在main线程中创建,并且接收用户的操作.如果阻塞该线程超过5s将弹出ANR对话框。同时android的UI工具包是非线程安全的。

因而有两点必须注意:

   1. 不要阻塞UI thread

   2. 不要在其它线程中操作UI

也因此推导出两个知识块:

   1. 对于需要长时间执行的任务需要启动work thread,在android中启动work thread的方法是什么?

   2. 在work thread 如何对UI进行更新和设置


Java传统方法 Thread / Runnable 继承Thread实现run
创建Runnable,实现run,实例作为参数创建Thread


使用Handler进行线程间交互

每一个Handler的实例都与唯一的线程以及该线程的message queue 相关联。

默认情况下handler与创建它的线程相关联,但是也可以在构造函数中传入Looper实例,以绑定到其它线程。

Handler的作用就是将message或runnable对象发送到与之相关联的message queue中,并且从queue中获取他们进行处理。

这就起到了将数据在线程中传递的目的,实现了线程间的交互。

          o 对于Handler启动runnable在下面的关于定时和周期性执行中进行详细介绍

          o 关联于main线程的handler,实现了帮助work thread 更新UI的目的,在关于在work thread中对UI进行更新和设置中详细介绍

          o 为了使handler关联于work thread而非main 线程,需要在构造函数时给定Looper实例

Looper用于执行一个线程的message 循环。通过它handler可以关联上相应的thread及其message queue。默认情况下,thread是没有Looper对象的,需要自己在thread中添加该对象,并调用其 prepare() 和 loop()方法。不考虑同步的情况下简单实现一个有Loop的thread.
    其中有2点值得注意:

       1. Looper 在调用prepare() 之后才指向当前thread,之前是指向main thread的
       2. handler必须在thread调用start方法(运行run)之后才能获取looper,否则为空,因为prepare需要在run方法中调用

          o 为了方面使用带有Looper的Thread,android实现了HandlerThread


   LoopThread thread1;
    public WifiSettings() {
        mFilter = new IntentFilter();
        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
              mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);

        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
handleEvent(intent);
            }
        };
              thread1 = new LoopThread("loopThread");
thread1.start();
mScanner = new Scanner(thread1.MyLooper);

    }




class LoopThread extends Thread{
public Looper MyLooper;
public LoopThread(String name) {
super(name);
MyLooper = Looper.myLooper();
Log.w(TAG, "in thread init: loop  "
+    MyLooper.getThread().getName()); // main
}

public void run() {
Log.w(TAG, "inthread :" + Thread.currentThread().getName()); // main
Looper.prepare();
MyLooper = Looper.myLooper();
Log.w(TAG, "inthread run: loop " + MyLooper.getThread().getName()); // name
Looper.loop();
}
}

分享到:
评论

相关推荐

    android——多线程

    在Android开发中,多线程是一项至关重要的技术,特别是在处理耗时操作时,如网络请求、数据解析等,以避免阻塞主线程导致用户界面(UI)无响应。标题"android——多线程"和描述"android——Handler与多线程应用范例...

    Android多线程分段下载源码

    这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的分块下载,并允许用户自定义线程数来控制下载速度和效率。下面我们将详细探讨这一技术。 首先,我们要理解什么是分段下载。传统的单线程...

    android 多线程下载机制

    在Android平台上,多线程下载机制是提升应用性能和用户体验的关键技术之一,特别是在处理大文件如应用程序、视频或音频资源的下载场景中。通过利用多线程,我们可以将一个大文件分割成多个小部分,然后同时启动多个...

    Android多线程任务优化2:实现后台预读线程

    在Android应用开发中,性能优化是一项至关重要的任务,特别是在处理数据加载、网络请求以及大量计算时。本篇文章将深入探讨如何通过实现后台预读线程来优化多线程任务,提高用户界面的响应速度和整体应用体验。 ...

    android多线程demo(很清晰很详细)

    本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...

    Android多线程下载(二)

    在Android多线程下载过程中,还要注意权限问题,比如需要在AndroidManifest.xml中添加INTERNET权限。此外,考虑到电量和流量消耗,还可以实现下载策略,如限制最大下载速度、夜间模式自动暂停等。 总之,Android多...

    android多线程管理

    在Android开发中,多线程管理是至关重要的技术,它涉及到应用的性能、用户体验以及资源的有效利用。Android系统默认在主线程(UI线程)执行所有的用户交互,如果在这个线程中执行耗时操作,会导致应用程序无响应...

    android 多线程断点下载及进度实时更新demo

    在Android开发中,多线程断点下载以及进度实时更新是一项重要的技术,它涉及到网络编程、文件操作和UI更新等多个方面。以下是对这个主题的详细解释: **多线程下载**: 多线程下载是为了提高文件下载速度和效率。...

    Android多线程PPT教学课件.pptx

    【Android多线程】\n\n在Android开发中,多线程是不可或缺的一部分,它能够提升应用程序的性能和用户体验。Android系统默认在一个主线程中运行应用程序,包括UI更新,如果在此线程中执行耗时操作,会导致用户界面...

    Android多线程实现简单字符串计数器

    本示例“Android多线程实现简单字符串计数器”旨在教你如何在Android环境中利用多线程来实现一个简单的字符串计数器功能。 首先,我们需要理解Android中的线程模型。主线程,也称为UI线程,负责处理用户界面的更新...

    android多线程实例

    本实例将深入探讨Android多线程的实践应用及理论知识。 首先,我们要理解多线程的基本概念。在单线程环境中,程序按照顺序执行,而多线程则允许多个任务并行运行,提高了系统资源的利用率。Android主线程,也被称为...

    Android 多线程下载简单demo之Thread

    在Android开发中,多线程下载是一项常见的任务,它能够有效地利用网络资源并提升用户体验。本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个...

    Android实例:多线程文件下载+在线音乐播放+清除下载文件

    1. **Android多线程下载** 在Android中,由于主线程(UI线程)不能执行耗时操作,因此在进行大文件下载时,我们需要使用多线程技术。通常,我们会创建一个后台线程来处理网络请求和文件写入,以避免阻塞UI。使用`...

    android多线程模型和service分析

    ### Android多线程模型与Service深入解析 #### 线程与进程概念解析 在深入探讨Android中的多线程模型之前,我们先明确一下基本概念。在计算机科学中,**进程**(Process)与**线程**(Thread)是两个核心概念。进程是...

    android java 多线程下载工具类调用一个方法即可

    下面我们将深入探讨多线程下载的原理以及如何在Android中实现。 1. **多线程下载原理**: - 多线程下载是指将一个大文件分割成多个小块,每个线程负责下载一个或多个小块。这种方式可以利用多核处理器的优势,同时...

    Android中AsyncTask实现多线程计数

    在Android应用开发中,多线程技术是必不可少的,它能让我们在不阻塞用户界面(UI)的情况下执行耗时操作。AsyncTask是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行计算,并在UI线程更新...

    android多线程高效编程

    根据标题《android多线程高效编程》和描述内容,我们可以了解到本书将从基础层面介绍线程和进程的概念,这是Linux内核管理执行流的基本单位,也是Android操作系统多任务处理的核心。然后,书中重点在于介绍Android...

    Android开发之多线程的操作方式

    在Android开发中,多线程是一项至关重要的技术,它使得应用程序可以同时执行多个任务,提升用户体验,特别是对于处理耗时操作如网络请求、大数据计算或长时间的UI更新时。本篇将详细介绍四种Android中实现多线程的...

    Android开发中的多线程编程技术

    ### Android开发中的多线程编程技术详解 #### 一、多线程编程的重要性与挑战 在Android开发过程中,多线程编程技术对于提高应用程序的性能和用户体验至关重要。...希望本文对您理解和应用Android多线程编程有所帮助。

    Android多线程下载器

    在Android系统中,主线程(UI线程)负责处理用户交互和界面更新,而其他工作线程则用来执行耗时操作,如文件下载,以避免阻塞主线程导致应用无响应。 2. **Android下载管理器**:Android系统自带了一个下载管理服务...

Global site tag (gtag.js) - Google Analytics