- 浏览: 87287 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wangyudong:
家里是拨号上网,不行的,找到了一个Holer工具,只需要配置一 ...
【如何通过广域网访问局域网的服务器?】 -
叮咚可乐名:
大数据就是这么任性第一季数据结构和算法http://pan.b ...
数据结构与算法-简介 -
戢_时光:
...
【Java集合之二】Set集合 -
lzg406:
HTTP默认方式下,使用持久连接。 这个值得推敲
【应用层】之一:HTTP协议与FTP协议 -
mute_:
特别腻害呢
正则表达式1:概念
本文围绕以下两个部分展开:
一、Async Task 异步任务
案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
一、Async Task 异步任务
1. Async Task 异步任务
AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数。
2. 使用方法
案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
效果如下:
进入主界面后,显示一个按钮:
当点击该按钮的时候,跳到另一个界面:异步任务界面。
要实现左上角“异步任务”左侧的回退按钮,只需要在功能清单文件中添加如下一句话:
添加到该Activity中:
当点击START按钮的时候,条形进度条和文本进度,都会以0.2秒增加1的速度增长,一直到100。
当进度达到100的时候,会弹出Toast提示:“结果:Google”。
(1)strings.xml
(2)activity_main.xml。主活动布局。
(3)新建一个Activity: AsyncTaskActivity。并在功能清单中设置回退按钮。
(4)MainActivity。主活动。按钮的点击事件。
(5)activity_async_task.xml。异步任务活动布局。包括一个START按钮,一个条形进度条和一个文本(文本进度)。
(6)AsyncTaskActivity。通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
一、Async Task 异步任务
案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
一、Async Task 异步任务
1. Async Task 异步任务
AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数。
2. 使用方法
/** * 自定义异步任务类 - 继承自 AsyncTask 类 */ /* 三个模板参数: (传入参数类型, 进度类型, 返回值类型) Params:传递给后台任务的参数类型。 Progress:后台计算执行过程中,进步单位(progress units)的类型。 (就是后台程序已经执行了百分之几了。) Result:后台执行返回的结果的类型。 AsyncTask并不总是需要使用上面的全部3种类型。 标识不使用的类型,只需要使用Void类型即可。 */ private class XxxTask extends AsyncTask<Params, Progress, Result> { /** * 1. 准备运行(可选) * <p/> * 该回调函数在任务被执行之后立即由UI线程调用。 * * 这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。 */ @Override protected void onPreExecute() { super.onPreExecute(); } /** * 2. 正在后台运行(必须重写) * * 该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。 * <p/> * 通常在这里执行耗时的后台计算。 * 计算的结果必须由该函数返回,并被传递到 onPostExecute()中。 * <p/> * 在该函数内也可以使用 publishProgress(Progress...)来发布一个或多个进度单位。 * 这些值将会在 onProgressUpdate(Progress...)中被发布到 UI线程 * * @param params * @return */ @Override protected String doInBackground(String... params) { return params[0]; } /** * 3. 完成后台任务(可选) * * 当后台计算结束后调用。 * * 后台计算的结果会被作为参数传递给这一函数。 * * @param s 后台计算的结果 */ @Override protected void onPostExecute(String s) { super.onPostExecute(s); } /** * 4. 进度更新 (可选) * <p/> * 该函数由 UI线程在 publishProgress(Progress...)方法调用完后被调用。 * * 一般用于动态地显示一个进度条。 * * @param values */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } /** * 5. 取消任务(可选) * <p/> * 在调用AsyncTask的cancel()方法时调用 */ @Override protected void onCancelled() { super.onCancelled(); } }
案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
效果如下:
进入主界面后,显示一个按钮:
当点击该按钮的时候,跳到另一个界面:异步任务界面。
要实现左上角“异步任务”左侧的回退按钮,只需要在功能清单文件中添加如下一句话:
android:parentActivityName=".MainActivity"
添加到该Activity中:
<activity android:name=".AsyncTaskActivity" android:label="@string/title_activity_async_task" android:parentActivityName=".MainActivity" />
当点击START按钮的时候,条形进度条和文本进度,都会以0.2秒增加1的速度增长,一直到100。
当进度达到100的时候,会弹出Toast提示:“结果:Google”。
(1)strings.xml
<resources> <string name="app_name">Async Task</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="btn_start">Start</string> <string name="btn_async_task">Async Task 异步任务</string> <string name="title_activity_async_task">异步任务</string> </resources>
(2)activity_main.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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/btnAsyncTask" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/btn_async_task" /> </RelativeLayout>
(3)新建一个Activity: AsyncTaskActivity。并在功能清单中设置回退按钮。
(4)MainActivity。主活动。按钮的点击事件。
public void onClick(View view) { startActivity(new Intent(this, AsyncTaskActivity.class)); }
(5)activity_async_task.xml。异步任务活动布局。包括一个START按钮,一个条形进度条和一个文本(文本进度)。
<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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.android.handlerthread.AsyncTaskActivity"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/btn_start" /> <ProgressBar android:id="@+id/progressBar" style="?android:progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/btnStart" android:visibility="gone" /> <TextView android:id="@+id/tvScale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/progressBar" android:visibility="gone" /> </RelativeLayout> <!-- 设置 ProgressBar 和 TextView 不可见, 当点击 START 按钮的时候,才可见。-->
(6)AsyncTaskActivity。通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)
package com.android.handlerthread; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class AsyncTaskActivity extends Activity { // 1.1 要用到主界面中的 ProgressBar 和 TextView,因此要先声明并初始化。 // 声明两个控件(RatingBar 和 TextView) private ProgressBar progressBar; private TextView tvScale; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async_task); // 1.2 初始化两个控件(ProgressBar 和 TextView) progressBar = (ProgressBar) findViewById(R.id.progressBar); tvScale = (TextView) findViewById(R.id.tvScale); } public void onClick(View view) { // 2. 设置控件可见,并启动任务 progressBar.setVisibility(View.VISIBLE); tvScale.setVisibility(View.VISIBLE); UpdateTask task = new UpdateTask(); // 这里输入的参数会传输给 doInBackground()方法 task.execute("Google"); } /** * 3. 自定义异步任务类 */ private class UpdateTask extends AsyncTask<String, Integer, String> { /** * 3.1 准备运行(可选) */ @Override protected void onPreExecute() { // 设置最大进度值:100 progressBar.setMax(100); } /** * 3.2 正在后台运行(必须重写) * * @param params * @return */ @Override protected String doInBackground(String... params) { for (int i = 0; i < 100; i++) { // 5.2.1 设置进度值 // 发布一个或多个进度单位(units of progress)。 // 这些值将会在 onProgressUpdate(Progress...)中被发布到 UI线程 this.publishProgress(i + 1); try { // 5.2.2 模拟具体完成的耗时任务 --- 比如:访问网络。 // 200毫秒,进度增 1 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (isCancelled()) { return "Cancelled"; } } return params[0]; } /** * 3.4 完成后台任务(可选) * * @param result 后台计算的结果 */ @Override protected void onPostExecute(String result) { // 完成后台任务后,给一个 Toast 提示 Toast.makeText(getApplicationContext(), "结果:" + result, Toast.LENGTH_SHORT).show(); } /** * 3.3 进度更新 (可选) * * @param values */ @Override protected void onProgressUpdate(Integer... values) { // 因为只传入一个值:"Google",因此对应的进度更新的时候,也是 values[0] progressBar.setProgress(values[0]); tvScale.setText(String.format("%d / %d", values[0], 100)); } /** * 取消任务(可选) */ @Override protected void onCancelled() { super.onCancelled(); } } // ----------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_async_task, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
发表评论
-
【攻克Android (43)】WebView (网络视图)
2015-09-09 22:15 1204本文围绕以下两个部分展开: 一、WebView WebVi ... -
WebView (网络视图)
2015-09-09 22:12 0本文围绕以下两个部分展开: 一、WebView WebVi ... -
【攻克Android (41)】HttpURLConnection
2015-09-08 17:43 1304本文围绕以下三个部分展开: 一、HttpURLConnec ... -
HttpURLConnection
2015-09-08 17:42 0本文围绕以下三个部分展开: 一、HttpURLConnec ... -
【攻克Android (40)】JSON解析
2015-09-07 20:49 1230本文围绕以下三个部分 ... -
JSON解析
2015-09-07 20:47 0本文围绕以下三个部分 ... -
【攻克Android (39):XML解析之四】Simple方式解析XML
2015-08-27 18:38 1658本文围绕以下三个部分 ... -
【攻克Android (38):XML解析之三】Pull方式解析XML
2015-08-27 09:25 1683本文围绕以下两个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (37):XML解析之二】SAX方式解析XML
2015-08-26 15:15 837本文围绕以下两个部分展开: 一、SAX解析 案例一 ... -
【XML解析之一】SAX方式解析XML
2015-08-26 02:58 0本文围绕以下四个部分展开: 一、SAX解析 案例一 ... -
【攻克Android (36):XML解析之一】DOM方式解析XML
2015-08-26 00:27 886本文围绕以下三个部分展开: 一、XML概述 二、DOM解析 ... -
DOM方式解析XML案例
2015-08-26 00:26 0本文围绕以下四个部分展开: 一、DOM解析 案例一 ... -
【XML解析之四】Simple方式解析XML
2015-08-27 18:36 0本文围绕以下三个部分 ... -
【XML解析之一】Pull方式解析XML
2015-08-26 02:56 0本文围绕以下四个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:22 833本文围绕以下四个部分 ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:21 0本文围绕以下四个部分 ... -
【攻克Android (45)】四大组件之 ContentProvider
2015-08-18 16:24 1000本文围绕以下两个部分展开: 一、ContentProvide ... -
【攻克Android (32)】Notification 通知
2015-08-17 19:57 888本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
Notification 通知
2015-08-17 19:56 0本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
BroadcastReceiver完整版
2015-08-17 13:15 0本文围绕以下四个部分展开: 一、广播 案例一:系统广播(属于 ...
相关推荐
RxJava封装异步任务RxAsyncTask
android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
https://oss.sonatype.org/content/repositories/snapshots/com/loopj/android/android-async-http/ Maven URL: https://oss.sonatype.org/content/repositories/snapshots/ GroupId: com.loopj.android ArtifactId...
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
自己写的一个winform小示例 用非常简短的几行代码演示C#5.0的异步编程新特性 不参杂其他无关代码,浅显易懂
android.async.http.jar包 包含1.2.0 至 1.4.8 版本。
Android异步任务下载一张图片,关键是异步任务的流程,带进度条的异步任务
Android Async-Http Demo
android的异步网络加载,方便使用,免去多余的代码
android-network-request-async-httpclient 有上传单个和多个文件
android-async-http官方项目:来自Github; 该项目中包含了多个版本的android-async-http.jar包,目前最新版本是:android-async-http-1.4.5.jar; 地址:原项目地址:https://github.com/loopj/android-async-http
最新异步网络请求android-async-http-1.4.5.jar
android-async-http开源框架可以是我们轻松的获取网络数据或者向服务器发送数据,使用起来也很简单,具体详细使用看官网:https://github.com/loopj/android-async-http
Springboot启用async异步调用Springboot启用async异步调用Springboot启用async异步调用
android-async-http 1.4.9版本,附带了其依赖的httpclient包
比较好用的安卓异步下载包,android-async-http-1.4.6.jar
2017最新版本android-async-http-master Android异步框架,并附有简单的导入方法以及报错处理
vc async socket异步网络通讯 示例
1)包里包含android-async-http-1.4.11.jar 和 httpclient-4.5.8.jar两个文件 2)强大的网络请求库,主要特征如下: 处理异步Http请求,并通过匿名内部类处理回调结果 Http请求均位于非UI线程,不会阻塞UI操作 通过...
android-async-http是专门针对Android在Apache的HttpClient基础上构建的异步http连接。所有的请求全在UI(主)线程之外执行,而callback使用了Android的Handler发送消息机制在创建它的线程中执行。