Android 中进程的生命周期:

<1>前台进程(Foreground process):正在运行着和用户交互的程序的进程

<2>可见进程(visible process):运行着处于可见状态组件的进程

<3>服务进程(Service process):运行着使用startService()方法的服务同时没有变为更两个级别的进程

<4>后台进程(Background process):运行着处于后台组件的进程,执行了Activity的onStop()方法后的进程

<5>空进程(Empty Process):不包含任何活动组建的进程,它们的存在是为了缓存的目的,能够加速重新启动当前程序的速度。

UI线程(主线程)模型的两条规则:

1.不要阻塞UI线程,否则超过5s会出现ANR(Applocation Not Responding)错误的危险。

2.不要在非UI线程中更新UI,否则直接报错。

解决UI线程模型两条规则之间的矛盾,提供了三种方式:

A.把主线程请到子线程的家里面,通过调用Activity的runOnUiThread(new Runnable(){  重写run方法 }} );

或者是view.post(new Runnable()){ 重写run方法 }} );

1.Activity.runOnUiThread(Runnable)

2.View.post(Runnable)

3.View.postDelayed(Runnable,long)

B.当子线程有更新UI需要的时候,当需要更新数据封装到消息对象中并反送给主线程进行更新UI(Handler机制)  以后补充!

C.使用Google提供的AsyncTask(异步)解决。

AsyncTask的特点:

掌握如何构建AsyncTask子类:

掌握AsyncTask<String,Integer,String>三个泛型参数的说明:

<1>第一个参数:指定当我们启动异步任务(execute()方法实参的数据类型)时传递给doInBackground(String...parms)

方法的形参的数据类型加上。。。

<2>第二个参数:指定对外报告进度时调用方法publish Progress()中实参的数据类型。。。也是

onProgressUpdate(Integer...values)方法形参的数据类型。。。

<3>第三个参数:指定doInBackground(String...parms)方法返回值的数据类型,也是onPostExcute(String s)方法形参的数据类型

package com.hsj.example.asynctaskdemo01;import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;import java.util.Arrays;/*** https://www.baidu.com/img/bd_logo1.png?qua=high&where=super*/
public class MainActivity_bak04 extends AppCompatActivity {private TextView textView_info;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.textView_info= (TextView) this.findViewById(R.id.textView_info);//实例化对话框对象this.progressDialog=new ProgressDialog(this);this.progressDialog.setMax(100);//将对话框样式设置成水平进度对话框this.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//当执行execute()方法时会自动调用doInBackground(Void... params)new MyAsyncTask().execute("http://www.baidu.com","http://www.163.com");// new MyAsyncTask().execute("http://www.baidu.com","http://www.163.com");//MyAsyncTask myAsyncTask=new MyAsyncTask();//myAsyncTask.execute("http://www.baidu.com","http://www.163.com");/*异步任务不能多次启动,否则报异常:Cannot execute task: the task is already running*///myAsyncTask.execute("http://www.baidu.com","http://www.163.com");}/*** AsyncTask<String,Integer,String>三个泛型参数说明:* 第一个参数:指定当我们启动异步任务(execute()方法实参的数据类型)时传递给doInBackground(String... params)方法的形参的数据类型加上...* 第二个参数:指定对外报告进度时调用方法publishProgress()中实参的数据类型....,也是onProgressUpdate(Integer... values)方法形参的数据类型...* 第三个参数:指定doInBackground(String... params)方法返回值的数据类型,也是onPostExecute(String s)方法形参的数据类型**/private final  class MyAsyncTask extends AsyncTask<String,Integer,String>{@Overrideprotected void onPreExecute() {//设置进度对话框的提示消息progressDialog.setMessage("开始下载网络图片......");//显示进度对话框progressDialog.show();System.out.println("===onPreExecute()===");}@Overrideprotected String doInBackground(String... params) {System.out.println("===doInBackground(String... params="+params+")==");System.out.println("params="+ Arrays.toString(params));//publishProgress(10,20,30);//报告进度的值会传递给onProgressUpdate(Integer... values)方法的形参valuesfor(int i=0;i<100;i++){publishProgress(i);if(i==50){System.out.println("===用户取消了下载====");//取消执行耗时操作this.cancel(true);}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}return "网络下载数据完毕";}@Overrideprotected void onProgressUpdate(Integer... values) {progressDialog.setProgress(values[0]);System.out.println("===onProgressUpdate(Integer... values="+Arrays.toString(values)+")===");}/*** 当用户执行了取消异步任务的操作后自动调用的方法,此时就不再调用onPostExecute(String s)* 当前方法也是运行在主线程中*/@Overrideprotected void onCancelled() {//销毁进度对话框progressDialog.dismiss();String threadName=Thread.currentThread().getName();System.out.println("===onCancelled().threadName="+threadName);}/*** 当正常执行完毕异步任务中的doInBackground()方法后指定调用的方法* @param s*/@Overrideprotected void onPostExecute(String s) {//销毁进度对话框progressDialog.dismiss();System.out.println("===onPostExecute(String s="+s+")====");}}}

示例代码:

package com.hsj.example.asynctaskdemo01;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView textView_info;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.textView_info= (TextView) this.findViewById(R.id.textView_info);}/*** android 单线程模型的内容:*   1.不要阻塞UI线程,因为超过5秒后可能会出现ANR(Application Not Response) 应用程序无响应错误*   2.不要在子线程中直接更新UI,否则会直接报错*** 为了解决android单线程模型的问题,我们提供了三种解决方案:*  A:把主线程请到子线程的家里来*      1. Activity.runOnUiThread(Runnable)*2. View.post(Runnable)3. View.postDelayed(Runnable, long)**  B:使用Handler机制(当子线程有更新UI的意愿时,把需要更新的数据封装成消息传递到主线程中在更新UI),将在第十八章详解**  C:使用异步任务解决,这章的重点.** @param view*/public void click(View view){/*在java 中开启子线程有两种方式:A:继承Thread 类B:实现Runnable 接口*/new  Thread(){@Overridepublic void run() {String threadName=Thread.currentThread().getName();System.out.println("threadName="+threadName);//模拟耗时操作,比如网络下载/* try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}*/final  String info="你点我的后果看到了吗?";/*//在子线程中开辟一块主线程的执行区域,方式一:runOnUiThread(new Runnable() {*//*** run()方法就运行在主线程中了*//*@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在内部类中访问外部类的局部变量则需要将局部变量变成常量textView_info.setText(info);}});*//*//方式二:textView_info.post(new Runnable() {@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在内部类中访问外部类的局部变量则需要将局部变量变成常量textView_info.setText(info);}});*///方式三:postDelayed(runnable,long):延迟long 毫秒后执行run()方法textView_info.postDelayed(new Runnable() {@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在内部类中访问外部类的局部变量则需要将局部变量变成常量textView_info.setText(info);}},2000);}}.start();}
}

异步任务的实例:

点击打开链接

android 之多线程详解相关推荐

  1. Android 多线程详解

    Android 多线程详解 一.多线程介绍 在学习多线程之前我们首先要了解几个与多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中 ...

  2. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  3. [Android]多进程知识点详解

    作者:Android开发_Hua 链接:https://www.jianshu.com/p/e0f833151f66 多进程知识点汇总: 一:了解多进程 二:项目中多进程的实现 三:多进程的优缺点与使 ...

  4. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  5. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  6. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  7. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  8. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  9. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

最新文章

  1. java clob 释放_在Java中处理CLOB字段
  2. 语音文件转成文字怎么转
  3. python 判断列表list是否为空
  4. logo qt添加_linux下如何给qt程序添加图标?
  5. android o miui特性,终于来了,小米开启 Android O 内测
  6. 免费 | 从通识到核心—自然语言处理专题公开课
  7. QT中动态库和静态库使用
  8. arrays合并两个数组_九章算法 | 字节跳动面试题:合并k个排序数组
  9. Java集合(List Map)
  10. java 验证服务器宕机_java服务宕机原因查询
  11. html{-webkit-text-size-adjust:none;}(取消浏览器最小字体限制)
  12. elasticsearch同义词配置elasticsearch-analysis-dynamic-synonym
  13. lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)
  14. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  15. 分区助手扩大c盘后自动修复_C盘空间不足怎么办?分区助手教你如何扩大C盘
  16. 微型计算机主板常用部件,简明微型计算机组装与维护教程
  17. unbuntu下pytorch安装
  18. 七年级上册计算机知识点总结,七年级上册数学知识点总结
  19. 微信小程序生成携带参数的小程序码
  20. 免费且不丢失数据的MBR转GPT软件!

热门文章

  1. 【遗传优化BP网络】基于自适应遗传算法的BP神经网络的股票预测MATLAB仿真
  2. 对比2个表mailbox_id字段的差集,然后做插入操作
  3. windows phone (23) ScrollViewer元素
  4. selenium测试(Java)--鼠标事件(六)
  5. 5G商用将在“十三五”时期内启动
  6. 模式 - 收藏集 - 掘金
  7. 学习Java第一个月
  8. 字符串表示的大整数相乘
  9. iphone NSArray 数组越界
  10. 三层路由中限制VLAN间转发,但其他转发正常事例