android开发--多线程
android中的几种多线程实现方式:
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable) ;View.postDelay(Runnable , long)
3)Handler
4)AsyncTask
介绍AsyncTask写法
用异步任务架构多任务模型其实也不是很健壮,得创建多个AsyncTask实例。一个AsyncTask仅执行一次,不能重复执行,快餐类的线程,一次用完。
实现AsyncTask子类,最重要的两个方法,一个是doInBackground(params);一个是onPostExecute(result)。在doInBackground()方法里处理耗时事务,并把结果返回,返回的值将在onPostExecute方法作为参数,然后就可以在onPostExecute()把结果展示在ui上面了。
步骤:
①实例化AsyncTask:
实例化AsyncTask然后通过task.exec(pamas);传进去参数,这个参数列表是动态的,可以是一个也可以使多个,长度可变。
AsyncTask<params,values,reslut>,第一个参数会传进去这个方法doInBackground(params),第二个参数是数据更新的值,第三个是处理事务返回的结果。
②onPreExecute方法:
这个方法没有参数,也没有返回值,可以在这个方法里,做一些提醒。比如show一个Dialog,或者弹个Toast告诉用户开始下载啦。
③doInBackground(params)方法:
进入AsyncTask内部结构,首先将执行reslut doInBackground(params)方法,这个方法将处理耗时事务,exec()的参数将会传进这个方法做参数,而返回值将会作为onPostExecute()的参数。如果要更新进度的话,需执行publicProgress()方法。
④onProgressUpdate(values)方法:
这个方法的参数必须在doInBackground()方法里执行publicProgress()方法,这个方法将会把参数传递进onProgressUpdate()方法里,然后可以在这个方法做一些ui上的更新展示,比如进度条的值就可以通过这个values值动态改变。
⑤onPostExecute(result)方法:
这里就是事务处理完毕的走的方法,doInBackground方法执行的结果将传到这里,如果这个方法返回了数据。在这个方法里可以处理Ui,可以把处理完的数据展示在ui上。比如图片啊,文字啊,一切你想要的结果。
案列
1、添加android项目文件
2、添加类继承AsyncTask,项目文件如下
用listview显示数据
3、添加布局文件,布局如下
<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.example.multithreadind01.MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/textView1"
android:layout_marginRight="53dp"
android:text="Button" /> <ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_marginTop="84dp" >
</ListView> <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/listView1"
android:layout_alignRight="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="28dp" /> </RelativeLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/username"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="60dp"
android:textSize="45dp"
/> <TextView
android:id="@+id/sex"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="60dp"
android:textSize="45dp"
/>
</LinearLayout>
MainActivity类代码:绑定数据
public class MainActivity extends Activity { private String fromDb_str1 = "";
private Button btn;
private TextView tv;
private ListView lv;
private BaseAdapter adapter;
private List<User> userList = new ArrayList<User>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 5; i++) {
User u = new User();
u.setUsername("小明"+i);
u.setSex("女"+i);
userList.add(u);
} tv =(TextView)findViewById(R.id.textView1);
btn =(Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
MyTask mt = new MyTask(MainActivity.this);
mt.execute(userList,adapter);//里面的参数是传给doInBackground
/*
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
fromDb_str1 = "测试";
}
});
t1.start();
tv.setText(fromDb_str1);
*/ }
});
adapter = new BaseAdapter(){ @Override
public int getCount() {
// TODO Auto-generated method stub
return userList.size();
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
View view;
if (convertView==null){
view = inflater.inflate(R.layout.item, null);
}
else{
view = convertView;
} TextView tv_username = (TextView)view.findViewById(R.id.username);
TextView tv_sex = (TextView)view.findViewById(R.id.sex);
tv_username.setText(userList.get(position).getUsername());
tv_sex.setText(userList.get(position).getSex());
return view;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
};
lv = (ListView)findViewById(R.id.listView1);
lv.setAdapter(adapter);
}
}
MyTask类,应用多线程,显示数据
package com.example.multithreadind01; import java.util.List; import android.os.AsyncTask;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast; public class MyTask extends AsyncTask { private BaseAdapter adapter;
private List<User> userList;
private MainActivity activity;
public MyTask(MainActivity activity){
this.activity = activity;
} //1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务)
//2.绝对不能碰UI
@Override
protected Object doInBackground(Object... params) { userList = (List<User>) params[0];
adapter = (BaseAdapter) params[1];
for (int i = 0; i < userList.size(); i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
userList.get(i).setUsername("小红"+i);
userList.get(i).setSex("男"+i);
publishProgress(i);
} //userlist,adapter //返回给前端
return "天气:22度";
} //准备
@Override
protected void onPreExecute() {
Toast.makeText(activity, "今晚不错啊", Toast.LENGTH_SHORT).show(); } //做完后执行
@Override
protected void onPostExecute(Object result) {
String r = result.toString();
TextView tv = (TextView)activity.findViewById(R.id.textView1);
tv.setText("访问完成!"+r); } //分步完成
@Override
protected void onProgressUpdate(Object... values) {
// TODO Auto-generated method stub //0,1,2,3,4
int bar = Integer.parseInt(values[0].toString());
bar = (bar+1)*20;
ProgressBar progressBar = (ProgressBar)activity.findViewById(R.id.progressBar1);
progressBar.setProgress(bar);
adapter.notifyDataSetChanged();
} }
效果图:开始界面,进行中,完成时
写安卓项目,我们应该一步一步来,一个功能一个功能去测试,而不是写完全部再去测试,这样出错误的话,找错误都不知道怎么找,应该稳打稳扎,
错误才好找,效率才会高。
android开发--多线程的更多相关文章
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
- Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载
效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- Android 开发中三种多线程
在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...
- Android开发用过的十大框架
http://blog.csdn.net/u011200604/article/details/51695096 本文系多方综合与转载整合,意在Android开发中能够知道和使用一些好用的第三方支持, ...
- (转) Android开发性能优化简介
作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...
- Android开发-之认识palette
Android开发中,Google工程师已经给我们封装好了很多的按钮,使得我们在开发中非常的方便和便捷. 那么今天就来认识一下常用的按钮,那么在之前的课程中我已经详细讲过了Button按钮,那么这里就 ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- Android开发学习清单
目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...
- Android开发60条技术经验总结
Android开发60条技术经验总结,以下是全文: 1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有 ...
随机推荐
- liunx之:ln命令
linux 一个很重要的命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s 源文件 目标文件 -s 是 symbolic的意思 ...
- tengine+tomcat配置
# 根据你服务器的cpu核数来确定此值 worker_processes 4; error_log logs/error.log crit; #error_log logs/error.log not ...
- npm 替换为 cnpm
最近执行npm安装组件时特别慢,网上建议可以换为cnpm,cmd命令:npm install -g cnpm --registry=https://registry.npm.taobao.org 可是 ...
- 读取其他软件listview控件的内容
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- AspNetPager控件报错误: Syntax error, unrecognized expression: input#ctl00$ContentPlaceHolder1$Aspnetpager1_input问题解决[摘]
高版本IE,如IE10或者IE11在浏览页面时出现错误: Syntax error, unrecognized expression: input#ctl00$ContentPlaceHolder1$ ...
- angular2开发01
// */ // ]]> angular2开发01 1. angular2 开发准备 1.1. 安装node 1.2. 安装npm 1.3. 运行qickStart 1 angular2 开发准 ...
- 关于SAP日期操作的几个函数
1.拆分年月---其实可以直接通过截取字符串的方法得到 CALL FUNCTION 'CACS_DATE_GET_YEAR_MONTH' EXPORTING I_DATE = SY-DATUM IMP ...
- Adobe 软件防止联网激活更改Hosts文件
来自为知笔记(Wiz) 附件列表
- 3.1 哈尔空间 V0
一张灰度图是由多个像素点而组成的,同样,这些像素点的是由一个从0(黑)到255(白)的非负数组成的.假设我们现在有一张小的灰度图像.在第一行的灰度值为110,100,120,140,130,100,1 ...
- JS设计模式--简单工厂模式
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...