Android中的多线程
文章目录
- 多线程
- 多线程的引入
- 模拟耗时任务
- 什么是主线程
- 什么是子线程
- 使用Handler处理多线程
- Handler
- Handler的使用步骤
- 例子一 模拟进度条的加载
- 使用AsyncTask处理多线程
- 什么是AsynaTask
- AsyncTask的优点
- 分析AsynaTask
- 变量的分析
- 方法的分析
- 例子 显示下载图片
多线程
多线程的引入
Android用户界面是与用户交互的接口 ,对于用户的操作,Android迅速响应用户输入 是一个重要目标。
如果Activity中的应用程序在5s之内未作出响应 ,可能会出现“应用程序无响应,是否关闭”的对话框
如果用户界面长时间对用户的操作未作出响应,这样的应用程序将会被淘汰。
对于后台下载、异步加载图片等这类耗时较多的工作,一般使用多线程的方法来解决。
模拟耗时任务
在这里我们用了两个按钮,使用相对分布一定要说明位置关系,否则会发生覆盖 ,一个按钮用来下载网络上的资源到本地,一个用来检测在下载的过程中,其他按钮是否可以正常使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:id="@+id/btn_download"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下载图片"/><Buttonandroid:id="@+id/btn_check"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="检测"android:layout_below="@+id/btn_download"/></RelativeLayout>
package net.onest.handlerpractice;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class MainActivity extends AppCompatActivity {private Button btnDownLoad;private Button btnCheck;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//方法:获得控件findViews();//给控件安装点击事件监听器btnDownLoad.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {//下载图片downLOadPicture();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});btnCheck.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//由Toast提示消息showToast();}});}//自定义的方法:下载图片private void downLOadPicture() throws IOException {URL url = new URL("https://image.baidu.com/search/detail?ct=503316480&z=0&tn=baiduimagedetail&ipn=d&cl=2&cm=1&sc=0&lm=-1&ie=gb18030&pn=4&rn=1&di=175120&ln=30&word=%B5%CF%C0%F6%C8%C8%B0%CD&os=3902488331,843254049&cs=3455184204,2524748306&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ffront%2F342%2Fw700h442%2F20190321%2FxqrY-huqrnan7527352.jpg&bdtype=0&simid=4228985784,624304665&pi=0&adpicid=0&timingneed=0&spn=0&is=0,0&fr=ala&ala=1&alatpl=adress&pos=1&oriquery=%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4&hs=2&xthttps=000000");URLConnection con = url.openConnection();InputStream in = con.getInputStream();FileOutputStream out = new FileOutputStream("D:迪丽热巴");byte[] buff = new byte[1024];int len = 0;while((len=in.read(buff))!=-1){out.write(buff,0,len);}out.close();in.close();}//自定义的方法,点击按钮显示toast提示消息private void showToast() {Toast.makeText(this,"用来判断在进行耗时长的任务时,其他按钮是否有反应",Toast.LENGTH_LONG).show();}//自定义的方法,用来获取控件对象的idprivate void findViews() {btnDownLoad = findViewById(R.id.btn_download);btnCheck = findViewById(R.id.btn_check);}
}
在上述代码运行中发现,当点击下载图片后由于是超时任务会自动弹出“应用无响应”的弹出框,其他按钮无法使用,如果直接点击“check”按钮,未点击“下载”按钮,会正常显示Toast提示信息。
什么是主线程
- Android中的主线程又称为UI线程
- Android应用刚启动时,会在当前应用所对应的进程中启动一个主线程
- 主线程用来处理与UI相关的事件 ,如:用户的按键事件、把相关的事件分派给对应的组件进行处理等。
- 对于UI线程中比较耗时的任务 ,开启一个子线程 来处理
- 只有主线程才可以更新UI界面
什么是子线程
用来处理UI线程中比较耗时的任务
创建子线程的两种方法:
实现Runnerable接口 new Thread(new Runnable() {}).start();
创建子线程是在触发点击事件里面完成的
//给控件安装点击事件监听器btnDownLoad.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//实现Runnable接口的方式创建子线程对象new Thread(new Runnable() {@Overridepublic void run() {try {//下载图片downLOadPicture();} catch (IOException e) {e.printStackTrace();}}}).start();}});
继承Thread类
new Thread(){重写run方法}.start();
//给控件安装点击事件监听器btnDownLoad.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//继承Thread类new Thread(){@Overridepublic void run() {try {//下载图片downLOadPicture();} catch (IOException e) {e.printStackTrace();}}}.start();}});
如果想下载网上的资源时,需要 :在Androidmanifest文件中设置****
使用Handler处理多线程
- 在上面的例子中,我们发现我们并没有涉及更新UI界面的问题 ,但是大多数情况下,我们是即需要异步执行 ,又需要更新ui界面 。而只有主线程才可以更新界面,这时Android为我们提供了两种解决方案:–使用多线程实现:Thread+Handler 和使用AsyncTask实现
Handler
Handler :接受子线程发送的数据,并用此数据配合主线程更新界面
Handler定义在主线程中
Handler充当主线程和子线程之间交互的中介:
- Handler在新启动的子线程中发送消息
- Handler在主线程中获取并处理子线程所发送的消息
UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue;
Looper:每个线程只能够有一个Looper,管理MessageQueue,不断地从中取出Message分发给对应的Handler处理,在主线程内
MessageQueue
Android中的多线程相关推荐
- Android中的多线程(字节跳动)
文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...
- Android中的多线程编程与异步处理
Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...
- Android 中的多线程简介
一.概念讲解 进程:是程序运行过程中系统进行资源分配和调度的一个独立单位,使多个程序可 并发执行,以提高系统的资源利用率和吞吐量. 线程:一个基本的CPU执行单元 & 程序执行流的最小单元. ...
- (Android小应用)在Android中实现多线程断点下载(连载二)
前面已经讲了通过多线程下载网络文件的一部分核心代码,下面继续做我们的项目 当然如果我们做小一点的Android项目的时候可以先做界面,然后根据需要来扩展所需要的功能,当然有的时候我们宁愿先实现业务,业 ...
- Android中Callable、Future、FutureTask的概念以及几种线程池的使用
学习线程池必备知识: 在开始介绍线程池之前,先来介绍下Callable和Future的概念,众所周知,Android中实现多线程的方式有两种,实现Runnable接口或者继承一个Thread,但是这两 ...
- Android 开发中的多线程编程技术
此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...
- Android开发中的多线程编程技术
Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的&q ...
- Dalvik/ART(ANDROID)中的多线程机制(2)
Android消息处理机制(二) 角色综述(回顾): (1)UI thread通常就是main thread,而Android启动程序时会替它建立一个MessageQueue. (2)当然需要一个Lo ...
- android设计一个多线程和画图的程序小球,Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例...
本文实例讲述了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法.分享给大家供大家参考,具体如下: 1.布局界面 xmlns:tools="http://sc ...
最新文章
- Qt Creator在桌面上预览
- 百度ueditor编辑器注入漏洞修补查杀程序
- JavaScript正则表达式的坑很深
- 持有1000枚比特币及以上的地址数量创历史新高
- leetcode哈希表解决异位词问题
- 2015年下半年的读书技术
- 黑雷苹果模拟器_精灵盛典iOS模拟器版本 已更新上架黑雷
- matlab检验相关性显著性检验,基于matlab的栅格数据相关分析及显著性检验
- JAVA IO ---------- File类(转自 skywang12345)
- QPS、TPS是什么
- 一种RGD-全氟化碳纳米乳MRI显影剂的制备方法
- Linux基础、vim、find命令等
- 老领导调岗,你想跟他干,怎么说?
- 【机房收费个人版】DataTable 与泛型集合的较量
- 什么是分布式存储系统?
- shadowplay要下载java,Simprit.MiniExcel.S60.Java
- 句柄和句柄类是不同!
- 名悦集团:新能源汽车保养做好这三步,用车无忧
- Python基础知识——跨目录调用文件
- swoole系列(一)- swoole入门与介绍
热门文章
- Android中的多线程(字节跳动)