• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android线程操作对象AsyncTask线程机制

Android线程操作对象AsyncTask线程机制

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android asynctask,android中asynctask,android.os.asynctask,asynctask 线程池,asynctask多线程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android线程操作对象AsyncTask线程机制


 简单的说,一个程序只有一个主线程,可以有多个主线程。在Android世界中也是这样,Android属于单线程模型,耗时操作必须放在非主线程中执行,故而谷歌为了方便我们使用线程,为我们提供一个AsyncTask多线程操作对象。

 

  对于Android使用线程还有一点需要特别注意,哪就是Android不允许在子线程中更新UI,相信很多初学者一定遇到过这个问题,这个怎么解决呢?在Activity中,我们可以通过
 

  new Thread(new Runnable() {

  @Override

  public void run() {

  Log.v("abc", "子线程执行");

  runOnUiThread(new Runnable() {

  @Override

  public void run() {

  Log.v("abc", "返回主线程执行");

  }

  });

  }

  }).start();
 

  来实现我们的效果,不过有一点需要注意的是,在Fragement中,runOnUiThread()不能使用,所以大家在使用时稍微注意一下即可。当然了Android中我们还可以通过Handler+Messager来完成多线程操作,对于这里个的使用,在之前的博客中已经为大家介绍,就不在赘述,下面我们开始介绍本篇的重点:AsyncTask的使用。
 

  AsyncTask<Parans, Progress, Result>是一个抽象类,我们需要首先实现这个抽象类,然后才能使用,对于它的三个参数:Parans:启动任务时输入的参数类型;progress:后台任务执行中返回值的类型;Result:后台执行任务完成后返回的结果类型。
 

  构建AsyncTask子类的回调方法:1、doInBackground:必须重写,异步执行后台线程将要完成的任务; 2、onPreExecute:执行后台耗时操作前被调用,通过用户完成一些初始化操作;3、onPostExecute:当doInBackground()完成之后,系统会自动调用,并将doInBackground()执行后的返回值,传递给onPostExecute()方法,简单来说就是,doInBackground()完成耗时操作,结果交个onPostExecute()方法更新UI;4、onProgressUpdate:在doInBackground()方法中,调用publishProgress()方法,更新任务的执行进度后,就会触发该方法。
 

  说了这么多,相信你心中还有一定的疑惑,下面我们通过两个简单的Android小程序,为大家具体介绍一下AsyncTask的使用方法:
 

  a、AsyncTask中是个抽象方法的执行顺序:
 

  1、创建一个AsyncTask子类对象:
 

  public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

  @Override

  protected void onPreExecute() {

  super.onPreExecute();

  Log.v("abc", "onPreExecute");

  }

  @Override

  protected Void doInBackground(Void... arg0) {

  Log.v("abc", "doInBackground");

  publishProgress(arg0);

  return null;

  }

  @Override

  protected void onPostExecute(Void result) {

  super.onPostExecute(result);

  Log.v("abc", "onPostExecute");

  }

  @Override

  protected void onProgressUpdate(Void... values) {

  super.onProgressUpdate(values);

  Log.v("abc", "onProgressUpdate");

  }

  }
 

  2、在MainActivity中调用给子线程,进行执行:
 

  public class MainActivity extends Activity {

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  new MyAsyncTask().execute();//启动执行

  }
 

  3、执行后打印的log日志:
 

  Android线程操作对象AsyncTask线程机制
 

  通过这个日志信息,是不是解决了你心中的疑惑,下面我们看一个使用AsyncTask加载网络图片的例子。
 

  b、加载网络图片:
 

  1、首先创建一个承载Activity布局文件的xml:
 

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  xmlns:tools="http://schemas.android.com/tools"

  android:layout_width="match_parent"

  android:layout_height="match_parent"

  android:layout_margin="10dp"

  tools:context=".MainActivity" >

  <ImageView

  android:id="@+id/img"

  android:layout_width="match_parent"

  android:layout_height="match_parent"

  />

  <ProgressBar

  android:id="@+id/progressbar"

  android:layout_width="wrap_content"

  android:layout_height="wrap_content"

  android:visibility="gone"

  android:layout_centerInParent="true"

  />

  </RelativeLayout>
 

  布局文件很简单,就是一个ImageView+ProgressBar,在加载ImageView是我们通过ProgressBar来提醒用户等待。
 

  2、创建我们的Activity对象
 

  public class AsyncTaskImager extends Activity {

  private ProgressBar pb;

  private ImageView image;

  private static final String url = "https://www.baidu.com/img/bdlogo.png";

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.imager);

  init();

  new ImageAsyncTask().execute(url);

  }

  private void init() {

  pb = (ProgressBar) findViewById(R.id.progressbar);

  image = (ImageView) findViewById(R.id.img);

  }

  class ImageAsyncTask extends AsyncTask<String, Void, Bitmap>{

  @Override

  protected void onPreExecute() {

  super.onPreExecute();

  pb.setVisibility(View.VISIBLE);

  }

  @Override

  protected Bitmap doInBackground(String... params) {

  Bitmap bitmap = null;

  URLConnection conn = null;

  String url = params[0];

  try {

  conn = new URL(url).openConnection();

  InputStream in = conn.getInputStream();

  BufferedInputStream bis = new BufferedInputStream(in);

  bitmap = BitmapFactory.decodeStream(bis);

  } catch (MalformedURLException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  }

  return bitmap;

  }

  @Override

  protected void onPostExecute(Bitmap result) {

  super.onPostExecute(result);

  pb.setVisibility(View.GONE);

  image.setImageBitmap(result);

  }

  }

  }
 

  到这里我们的大功已经基本完成了,最后不要忘记在AndroidManifest.xml中进行一下声明。
 

  3、添加网络操作权限:
 

  <uses-permission android:name="android.permission.INTERNET"/>

  因为我们需要使用到网络连接,所以我们需要在AndroidManifest.xml中添加一个网络访问权限。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • AsyncTask注意事项,面试技巧和注意事项
  • 再谈Android AsyncTask的优缺点,androidasynctask
  • Android中AsyncTask分析--你所不注意的坑,androidasynctask
  • AsyncTask基础(笔记)
  • Android中AsyncTask基本用法与源码剖析(API 23)
  • android源码解析之(二)--)异步任务AsyncTask
  • AsyncTask源码探究,asynctask源码
  • android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
  • Android线程操作对象AsyncTask线程机制
  • AsyncTask.cancel()的结束问题,asynctaskcancel

相关文章

  • 2017-05-26Android pm命令详解
  • 2017-05-26Android客户端采用Http 协议Post方式请求与服务端进行数据交互
  • 2017-05-26android注册页面,android页面
  • 2017-05-26美女的秘密应用项目源码,秘密项目源码
  • 2017-05-26安卓应用反编译(二)-APK包反编译浅析
  • 2017-05-26Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid
  • 2017-05-26DrawerLayout的openDrawer()和closeDrawer()方法,drawerlayout
  • 2017-05-26当EditText编辑时 hint 在 6.0 手机上显示不出来,edittexthint
  • 2017-05-26硅谷新闻2--禁止viewpager预加载,2--viewpager
  • 2017-05-26Android的Message Pool是什么——源码角度分析,androidpool

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Hive 1.2.1&Spark&Sqoop安装指南
    • Android Fragment生命周期,androidfragment
    • Android之SystemUI加载流程和NavigationBar的分析
    • Android程序中--不能改变的事情,android程序--改变
    • Android细笔记--ContentProvider,--contentprovider
    • WebView上实现Java与JavaScript交互,webviewjavascript
    • androidj基础:从网上下载图片,
    • 美女的秘密应用项目源码,秘密项目源码
    • 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试,buglykotlin
    • Android中使用SDcard进行文件的读取,androidsdcard

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有