android开发 - AsyncTask
来源:互联网 发布:linux 重启服务器命令 编辑:程序博客网 时间:2024/06/03 18:56
一般我们加载完数据,给做下缓存,最好了
ListView分页
主布局
<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" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"/>
</RelativeLayout>
item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#f00"
android:id="@+id/textview"/>
</LinearLayout>
页脚加载显示布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="50dp"
android:layout_height="50dp"
style="?android:attr/progressBarStyle"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载。。。" />
</LinearLayout>
java代码
public class MainActivity extends Activity {
private ListView listView;
private List<String> data;
private ArrayAdapter<String> adapter;
private View footView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) this.findViewById(R.id.listview);
data = new ArrayList<String>();
listView.setOnScrollListener(new MyListView());
data.addAll(DataService.getData(0, 30));
adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.textview,
data);
footView = getLayoutInflater().inflate(R.layout.footerloading, null);
listView.addFooterView(footView);
listView.setAdapter(adapter);
listView.removeFooterView(footView);
}
private int number = 30;
private int maxpage = 5;
private boolean finish = true;
private final class MyListView implements OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("MainActivity", "onScrollStateChanged()");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
final int total = totalItemCount;
// 取到ListView的最后一条数据的索引
int lastItemId = listView.getLastVisiblePosition();
if ((lastItemId + 1) == totalItemCount) {
// 取当前页码
int currentPage = totalItemCount % number == 0 ? totalItemCount
/ number : totalItemCount / number + 1;
// 下一页
int nextpage = currentPage + 1;
if (nextpage <= maxpage && finish) {
listView.addFooterView(footView);
finish = false;
new Thread(new Runnable() {
public void run() {
List<String> list = DataService.getData(total,
number);
handler.sendMessage(handler.obtainMessage(100,list));
}
}).start();
}
}
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
data.addAll((List<String>) msg.obj);
adapter.notifyDataSetChanged();// 告诉listView数据已经发生改变,要求ListView更新界面
if(listView.getFooterViewsCount() > 0){
listView.removeFooterView(footView);
}
finish = true;
};
};
}
}
使用AsyncTask 异步任务
异步任务优点:就是新起来一个线程,执行过程中不会阻塞UI线程
异步任务就是开辟了一个新的线程,去执行一个不阻塞UI线程的操作
注意:
1. 在UI线程中,直接操作是不允许访问网络的
2. 允许访问网络,使用AsyncTask
异步任务执行步骤
1. onPreExecute()
2. doInBackground(Params...)
3. onProgressUpdate(Progress...)
4. onPostExecute(Result);
使用异步任务的规则:
1. 声明一个类继承AsyncTask 标注三个参数的类型
2. 第一个参数表示要执行的任务,通常是网络的路径,
第二个参数表示进度的刻度
第三个参数表示任务执行的返回结果
下载一张图片的代码如 非阻塞式的:
1. 申请联网授权:
<uses-permission android:name="android.permission.INTERNET" />
2. java代码
public class MainActivity extends Activity {
private ImageView iview;
private ProgressDialog progressDialog;
private String Path = "http://pic.58pic.com/58pic/17/13/57/27Y58PICFHf_1024.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iview = (ImageView)this.findViewById(R.id.imageView1);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("提示信息");
progressDialog.setMessage("正在下载,下载中......");
}
//下载图片点击事件
public void downloadImage(View v){
new MyTask().execute(Path);
}
//异步执行任务,内部实现也是开启了一个新的线程
public class MyTask extends AsyncTask<String,Void,Bitmap>{
//表示任务执行之前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
//主要是完成耗时的操作
@Override
protected Bitmap doInBackground(String... params) {
//这里就是下载图片,使用HttpClient类,网络数据的提取
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//主要是更新UI的操作
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iview.setImageBitmap(result);
progressDialog.dismiss();
}
}
}
下载图片代码:
阻塞式弹出进度条,并且是真正的计算进度条
public class MainActivity extends Activity {
private String path = "http://img3.3lian.com/2013/c4/103/d/8.jpg";
private ProgressDialog dialog;
private ImageView iView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialog = new ProgressDialog(this);
dialog.setTitle("系统提示");
dialog.setMessage("正在loading......");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
iView = (ImageView) this.findViewById(R.id.imageView1);
}
public void downloadImage(View v){
new MyTask().execute(path);
}
private class MyTask extends AsyncTask<String,Integer,Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
@Override
protected Bitmap doInBackground(String... arg0) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(arg0[0]);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream inputStream = null;
Bitmap bitmap = null;
try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
inputStream = response.getEntity().getContent();
long file_len = response.getEntity().getContentLength();
int len=0;
byte[] buffer = new byte[1024];
int total_length = 0;
while((len = inputStream.read(buffer)) != -1){
total_length += len;
int value = (int)((total_length / (float)file_len) * 100);
publishProgress(value);
outputStream.write(buffer,0,len);
}
byte[] tempOutputStream = outputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(tempOutputStream, 0, tempOutputStream.length);
}
} catch (Exception e) {
e.printStackTrace();
}
// finally{
// if(outputStream != null){
// try {
// outputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if(inputStream != null){
// try {
// inputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iView.setImageBitmap(result);
dialog.dismiss();
}
}
}
ListView分页
主布局
<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" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"/>
</RelativeLayout>
item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#f00"
android:id="@+id/textview"/>
</LinearLayout>
页脚加载显示布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="50dp"
android:layout_height="50dp"
style="?android:attr/progressBarStyle"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载。。。" />
</LinearLayout>
java代码
public class MainActivity extends Activity {
private ListView listView;
private List<String> data;
private ArrayAdapter<String> adapter;
private View footView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) this.findViewById(R.id.listview);
data = new ArrayList<String>();
listView.setOnScrollListener(new MyListView());
data.addAll(DataService.getData(0, 30));
adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.textview,
data);
footView = getLayoutInflater().inflate(R.layout.footerloading, null);
listView.addFooterView(footView);
listView.setAdapter(adapter);
listView.removeFooterView(footView);
}
private int number = 30;
private int maxpage = 5;
private boolean finish = true;
private final class MyListView implements OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("MainActivity", "onScrollStateChanged()");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
final int total = totalItemCount;
// 取到ListView的最后一条数据的索引
int lastItemId = listView.getLastVisiblePosition();
if ((lastItemId + 1) == totalItemCount) {
// 取当前页码
int currentPage = totalItemCount % number == 0 ? totalItemCount
/ number : totalItemCount / number + 1;
// 下一页
int nextpage = currentPage + 1;
if (nextpage <= maxpage && finish) {
listView.addFooterView(footView);
finish = false;
new Thread(new Runnable() {
public void run() {
List<String> list = DataService.getData(total,
number);
handler.sendMessage(handler.obtainMessage(100,list));
}
}).start();
}
}
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
data.addAll((List<String>) msg.obj);
adapter.notifyDataSetChanged();// 告诉listView数据已经发生改变,要求ListView更新界面
if(listView.getFooterViewsCount() > 0){
listView.removeFooterView(footView);
}
finish = true;
};
};
}
}
使用AsyncTask 异步任务
异步任务优点:就是新起来一个线程,执行过程中不会阻塞UI线程
异步任务就是开辟了一个新的线程,去执行一个不阻塞UI线程的操作
注意:
1. 在UI线程中,直接操作是不允许访问网络的
2. 允许访问网络,使用AsyncTask
异步任务执行步骤
1. onPreExecute()
2. doInBackground(Params...)
3. onProgressUpdate(Progress...)
4. onPostExecute(Result);
使用异步任务的规则:
1. 声明一个类继承AsyncTask 标注三个参数的类型
2. 第一个参数表示要执行的任务,通常是网络的路径,
第二个参数表示进度的刻度
第三个参数表示任务执行的返回结果
下载一张图片的代码如 非阻塞式的:
1. 申请联网授权:
<uses-permission android:name="android.permission.INTERNET" />
2. java代码
public class MainActivity extends Activity {
private ImageView iview;
private ProgressDialog progressDialog;
private String Path = "http://pic.58pic.com/58pic/17/13/57/27Y58PICFHf_1024.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iview = (ImageView)this.findViewById(R.id.imageView1);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("提示信息");
progressDialog.setMessage("正在下载,下载中......");
}
//下载图片点击事件
public void downloadImage(View v){
new MyTask().execute(Path);
}
//异步执行任务,内部实现也是开启了一个新的线程
public class MyTask extends AsyncTask<String,Void,Bitmap>{
//表示任务执行之前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
//主要是完成耗时的操作
@Override
protected Bitmap doInBackground(String... params) {
//这里就是下载图片,使用HttpClient类,网络数据的提取
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//主要是更新UI的操作
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iview.setImageBitmap(result);
progressDialog.dismiss();
}
}
}
下载图片代码:
阻塞式弹出进度条,并且是真正的计算进度条
public class MainActivity extends Activity {
private String path = "http://img3.3lian.com/2013/c4/103/d/8.jpg";
private ProgressDialog dialog;
private ImageView iView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialog = new ProgressDialog(this);
dialog.setTitle("系统提示");
dialog.setMessage("正在loading......");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
iView = (ImageView) this.findViewById(R.id.imageView1);
}
public void downloadImage(View v){
new MyTask().execute(path);
}
private class MyTask extends AsyncTask<String,Integer,Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
@Override
protected Bitmap doInBackground(String... arg0) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(arg0[0]);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream inputStream = null;
Bitmap bitmap = null;
try {
HttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
inputStream = response.getEntity().getContent();
long file_len = response.getEntity().getContentLength();
int len=0;
byte[] buffer = new byte[1024];
int total_length = 0;
while((len = inputStream.read(buffer)) != -1){
total_length += len;
int value = (int)((total_length / (float)file_len) * 100);
publishProgress(value);
outputStream.write(buffer,0,len);
}
byte[] tempOutputStream = outputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(tempOutputStream, 0, tempOutputStream.length);
}
} catch (Exception e) {
e.printStackTrace();
}
// finally{
// if(outputStream != null){
// try {
// outputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if(inputStream != null){
// try {
// inputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iView.setImageBitmap(result);
dialog.dismiss();
}
}
}
0 0
- Android开发中AsyncTask
- 【Android 开发】: AsyncTask 详解
- 【Android 开发】: AsyncTask 详解
- android开发学习--AsyncTask
- android开发学习--AsyncTask
- android开发 - AsyncTask
- Android开发-AsyncTask
- 【Android开发】android-AsyncTask介绍
- android开发--AsyncTask的用法
- Android开发:高度优化AsyncTask
- android应用开发之AsyncTask
- android开发 AsyncTask的使用
- Android开发 深入理解AsyncTask
- android开发笔记之AsyncTask
- android开发-AsyncTask源码解析
- Android 开发中的 AsyncTask 的用法记录
- Android开发 AsyncTask异步任务类
- Android开发AsyncTask异步处理任务
- 字符串逆序输出
- 《Unix编程艺术》
- UITableView
- MySQL终端的常用命令
- Python学习之路14——列表
- android开发 - AsyncTask
- innodb锁级别分析(一)
- uva12260 - Free Goodies 贪心+dp
- 玩命牛的成长记录(五)——表格表单
- Leetcode: Binary Tree Preorder Traversal(二叉树前序遍历)
- keil mdk 编程时出现黑光标的解决办法
- 不可变类详解
- 初步动手小制作
- KD-tree的原理以及构建与查询操作的python实现