理解Android的AsyncTask

1、AsyncTask是Android为了解决UI主线程不阻塞的问题而提供的一个较Handler更轻量级的一个异步类。

      先来看一个不使用异步处理开启线程的例子:

     

package com.tang.Javen;

import android.app.Activity;

public class MainActivity extends Activity {
	private Button threadBtn, getLogBtn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        threadBtn = (Button)findViewById(R.id.button1);
        getLogBtn = (Button)findViewById(R.id.button2);

        threadBtn.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				ThreadOperator operator = new ThreadOperator();
				operator.operate();
			}
		});
        
        getLogBtn.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				Log.d("Javen","获取打印信息");
			}
		});
    }
}


package com.tang.Javen;

public class ThreadOperator
{
	public void operate()
	{
		try
		{
			Thread.sleep(8*1000);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这里我们在主线程中去new一个ThreadOperator类,然后在这个类中去让线程睡眠8秒中,而这里的线程就是指的主线程。


当点击开启线程这个Button时,然后在点击获取打印的Button,就可以看到


系统提示没有响应,这就是因为在主线程中线程阻塞时间太长的原因,android一般主线程阻塞5秒之后,系统就会提示无响应。所有我们最好的办法就是把比较耗时的操作放到一个异步类中去,让这些比较耗时的操作不阻塞我们的主线程。

2、新建一个类继承AsyncTask,然后在这里让线程休眠

package com.tang.Javen;

import android.os.AsyncTask;

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

	@Override
	protected Void doInBackground(Void... params)
	{
		ThreadOperator operator = new ThreadOperator();
		operator.operate();
		return null;
	}

}

在MainActivity中修改代码

    threadBtn.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
//				ThreadOperator operator = new ThreadOperator();
//				operator.operate();
				Frist<span class="KSFIND_CLASS_SELECT" id="0KSFindDIV">AysncTask </span><span class="KSFIND_CLASS" id="1KSFindDIV">aysncTask </span>= new FristAysncTask();
				aysncTask.execute();
			}
		});

这个我们就把耗时操作放到了异步线程中去了


这样就不会出现无响应的问题了,同时打印信息也可以很快就打印出来了.


3、使用AsyncTask来实现如下图界面的功能


package com.tang.Javen;

import android.app.Activity;

public class MainActivity extends Activity {
	private Button asyncTaskBtn;
	private TextView textView;
	private ProgressBar progressBar;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        aysncTaskBtn = (Button)findViewById(R.id.button1);
        textView = (TextView)findViewById(R.id.text);
        progressBar = (ProgressBar)findViewById(R.id.progressBar1);
        asyncTaskBtn.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				/*ThreadOperator operator = new ThreadOperator();
				operator.operate();*/
				Frist<span class="KSFIND_CLASS" id="2KSFindDIV">AsyncTask </span><span class="KSFIND_CLASS" id="3KSFindDIV">asyncTask </span>= new FristAsyncTask(textView, progressBar);
				asyncTask.execute(1000);
			}
		});
    }
}

这里asyncTask.execute(1000)的1000会传递到AsyncTask类中的doInBackground函数中当我参数

package com.tang.Javen;

import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

public class Frist<span class="KSFIND_CLASS" id="4KSFindDIV">AsyncTask </span>extends AsyncTask<Integer, Integer, String>
{

	private TextView textView = null;
	private ProgressBar progressBar = null;
	
	public FristAsyncTask(TextView textView, ProgressBar progressBar)
	{
		super();
		this.textView = textView;
		this.progressBar = progressBar;
	}

	/**
	 * 在执行完onPreExecute函数后,就正式进入到异步操作了,开启另外一个线程
	 * 在AysncTask类中有三个参数,第一个参数就是指的doInBackground中要传入的参数
	 * 这个的参数,是从MainActivity中的asyncTask.execute(1000)传过来的
	 * 其中Integer...代表这个参数是一个数组,也可以这样传asyncTask.execute(1000,2000),则params[0] == 1000, params[1]== 2000
	 * doInBackground的返回值类型则是AysncTask中的第三个参数,且这个返回的值最终会传递到onPostExecute()中去
	 */
	@Override
	protected String doInBackground(Integer... params)
	{
		int i = 0;
		ThreadOperator operator = new ThreadOperator();
		for(i = 10; i <= 100; i+=10)
		{
			operator.operate();
			/**
			 * 在doInBackground中调用publishProgress函数,则会调用onProgressUpdate()函数
			 * 主要用来更新UI主线程中的progressBar的状态
			 */
			publishProgress(i);
		}
		return i + params[0].intValue() + "";
	}

	//最后当异步操作结束后,会调用到onPostExecute函数,且把doInBackground的返回值作为参数传进这个onPostExecute
	@Override
	protected void onPostExecute(String result)
	{
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		textView.setText("<span class="KSFIND_CLASS" id="5KSFindDIV">AysncTask </span>结束"+result);
	}

	/**
	 * 当execute一个AsyncTask后首先就会调用这个类的onPreExecute()函数,
	 * 且这个函数是在UI主线程中执行,所有可以做开启异步操作之前的UI界面更新提示
	 */
	@Override
	protected void onPreExecute()
	{
		// TODO Auto-generated method stub
		super.onPreExecute();
		textView.setText("AysncTask异步线程开启");
	}

	//onProgressUpdate会在调用publishProgress后被调用,且这个函数是在UI主线程中,所有可以用来更新UI界面
	@Override
	protected void onProgressUpdate(Integer... values)
	{
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		progressBar.setProgress(values[0]);
	}

}

4、AsyncTask的执行过程分析

public class FristAsyncTask extends AsyncTask<Integer, Integer, String>

AsyncTask后带有三个参数(Void代表空)

分别对应如下:

参数一:Integer对应doInBackground中的参数

	protected String doInBackground(Integer... params)

参数二:Integer对应onProgressUpdate中的参数

protected void onProgressUpdate(Integer... values)
参数三:String对应doInbackground中的返回值类型和onPostExecute函数中的参数
protected void onPostExecute(String result)
4.1、当我们execute一个AsyncTask时,则会先调用异步类中的onPreExecute函数,这个函数是在UI主线程中执行的
@Override
	protected void onPreExecute()
	{
		// TODO Auto-generated method stub
		super.onPreExecute();
		textView.setText("AysncTask异步线程开启");
	}

我们在这里通过textView来提示异步线程开启

4.2、其次当完成了onpreExecute之后,会调用到doInBackground函数进行真正的异步操作

	@Override
	protected String doInBackground(Integer... params)
	{
		int i = 0;
		ThreadOperator operator = new ThreadOperator();
		for(i = 10; i <= 100; i+=10)
		{
			operator.operate();
			/**
			 * 在doInBackground中调用publishProgress函数,则会调用onProgressUpdate()函数
			 * 主要用来更新UI主线程中的progressBar的状态
			 */
			publishProgress(i);
		}
		return i + params[0].intValue() + "";
	}

在AysncTask类中有三个参数,第一个参数就是指的doInBackground中要传入的参数, 这个的参数,是从MainActivity中的aysncTask.execute(1000)传过来的,其中Integer...代表这个参数是一个数组,也可以这样传aysncTask.execute(1000,2000),则params[0] == 1000, params[1]== 2000,doInBackground的返回值类型则是AysncTask中的第三个参数,且这个返回的值最终会传递到onPostExecute()中去

4.3、 在doInBackground中调用publishProgress函数,则会调用onProgressUpdate()函数, 主要用来更新UI主线程中的progressBar的状态

//onProgressUpdate会在调用publishProgress后被调用,且这个函数是在UI主线程中,所有可以用来更新UI界面
	@Override
	protected void onProgressUpdate(Integer... values)
	{
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		progressBar.setProgress(values[0]);
	}

4.4、最后当异步操作结束后,会调用到onPostExecute函数,且把doInBackground的返回值作为参数传进这个onPostExecute

@Override
	protected void onPostExecute(String result)
	{
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		textView.setText("AysncTask 结束"+result);
	}






ps:eclipse中注释单行代码可以用Ctrl+/ ,取消也是用Ctrl+/

//				ThreadOperator operator = new ThreadOperator();
//				operator.operate();
如果想注释多行代码可以用Ctrl+shift+/,取消则用Ctrl+shift+\

/*ThreadOperator operator = new ThreadOperator();
				operator.operate();*/




AysncTask
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
### 回答1: Android面试问题可以包括以下几个方面: 1. Android基础知识:这包括对Android操作系统的理解,四大组件(活动、服务、内容提供者、广播接收器)的使用和生命周期等等。 2. Java编程:Android开发主要使用Java语言,因此对Java语法、OOP(面向对象编程)的理解和Java常用类的使用都是必备的。 3. 布局和界面:Android应用开发离不开界面的设计和布局,对常用布局(如线性布局、相对布局、帧布局)和控件的使用熟练掌握是重要的。 4. 数据存储和管理:了解Android中数据的存储方式,如使用SQLite数据库、SharedPreferences等进行本地数据存储,也要了解网络数据的请求和处理。 5. 多线程和异步编程:对于Android应用来说,处理耗时任务需使用多线程或异步编程方式,了解如何使用AsyncTask、Handler等组件来实现多线程操作是必要的。 6. 性能优化和内存管理:在开发Android应用时,需要对应用的性能进行优化,理解内存泄漏的原因,掌握使用Android Profiler等工具进行性能分析和调优。 7. 第三方库和框架:熟悉常用的Android第三方库和框架(如Retrofit、Glide、ButterKnife),了解它们的用途和基本使用方法。 8. 安全性:了解Android应用开发中的安全性问题,如如何保护用户数据、防止恶意攻击等。 9. 版本控制工具:熟悉使用Git等版本控制工具进行代码管理和团队协作。 10. 实际项目经验:面试官可能会问到你在之前的实际项目中遇到的问题和解决方案,以及你的贡献和角色等。 回答这些问题时,建议结合自己的实际经验和项目经历进行回答,展示自己的能力和对Android开发的理解。 ### 回答2: 在Google的Android面试中,可能会遇到以下问题: 1. 请介绍一下Android平台的架构。 Android平台的架构由Linux内核、硬件驱动、运行时库、应用框架和应用组成。Linux内核是底层硬件控制的核心,硬件驱动提供了与硬件交互的接口,运行时库包括了核心库和C/C++库,应用框架提供了开发应用程序的API接口,应用则是用户使用的应用程序。 2. 请介绍一下Android的四大组件。 Android的四大组件包括Activity、Service、Broadcast Receiver和Content Provider。Activity负责提供用户界面,Service负责后台执行长时间运行的任务,Broadcast Receiver负责接收和处理系统广播消息,Content Provider负责数据共享和存取。 3. 请介绍一下Activity的生命周期。 Activity的生命周期包括onCreate、onStart、onResume、onPause、onStop、onDestroy等方法。当Activity被创建时会调用onCreate方法,当其可见但还无法与用户交互时会调用onStart和onResume方法,当其失去焦点但未被销毁时会调用onPause方法,当其完全不可见时会调用onStop方法,当Activity被销毁时会调用onDestroy方法。 4. 请介绍一下Android的布局文件和代码文件。 Android的布局文件使用XML语言编写,用于定义应用界面的组件和布局方式。代码文件用于处理布局文件中的组件的行为,包括点击事件、数据绑定等逻辑。 5. 请介绍一下Android的Intent。 Intent是Android中用于传递消息和执行动作的对象。它可以用于启动Activity、Service和Broadcast Receiver,也可以用于发送和接收数据。通过Intent,可以在不同的组件之间传递数据和通信。 总结: Android面试中,会涉及到Android平台的架构、四大组件、Activity的生命周期、布局文件和代码文件的概念以及Intent的使用。准备这些内容,能够更好地回答面试官的问题,展示自己的Android开发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值