android异步任务载入数据界面实现
android 异步任务的一个后台方法本质是开启一个线程完毕耗时操作,其它onPostExecute方法和onPreExecute方法执行在UI主线程用于更新UI界面。为了提高用户体验常见的异步任务载入方式如今总结例如以下:
1、异步载入界面效果例如以下:
关键代码例如以下所看到的:
/**
* 异步任务给列表载入数据
*/
private void fillData(){
new AsyncTask<Void,Void,Void>(){ @Override
protected void onPreExecute() {
loading.setVisibility(View.VISIBLE);
super.onPreExecute();
} @Override
protected void onPostExecute(Void result) {
loading.setVisibility(View.INVISIBLE);
//刷新界面列表数据
if(mAdapter==null){
mAdapter=new RubishSmsInfosAdapter();
mRubishSms.setAdapter(mAdapter); }else{ mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
} @Override
protected Void doInBackground(Void... params) {
if(mInfos==null){
mInfos=mRubishSmsInfoDao.findInfosbyPage(maxNum, offset);
}else{ mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNum, offset));
} try { Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }.execute(); }
loading相应的
loading=findViewById(R.id.ll_rublish_sms_info_loading);
布局文件例如以下:
activity_rubish_sms.xml
<?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" > <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="100" > <LinearLayout
android:layout_gravity="center"
android:id="@+id/ll_rublish_sms_info_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="invisible" > <ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据载入中,请稍后..."
android:textSize="13sp" />
</LinearLayout>
</FrameLayout> <ListView
android:id="@+id/lv_rubish_sms_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView> </LinearLayout>
通过如上代码就可以实现上述效果。
2、利用对话框实现
实现效果图:
异步任务实现 逻辑代码:
/**
* 扫描病毒 并动态显示在界面
*/
private void scanVirus(){
new AsyncTask<Void,Object, Void>() {
List<VirusApp> apps=new ArrayList<VirusApp>();
String desc=null;
Dialog dialog=new Dialog(KillVirusActivity.this);
View viewKilling=View.inflate(KillVirusActivity.this,R.layout.killing_dialog,null);
@Override
protected void onPreExecute() {
mKillVirusResult.setText("正在扫描中,请稍等...");
dialog.setCancelable(false);
dialog.setContentView(viewKilling);
dialog.show();
pm=getPackageManager();
packageInfos=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES|PackageManager.GET_SIGNATURES);
// progressBar.setMax(packageInfos.size());
super.onPreExecute();
} @Override
protected void onPostExecute(Void result) {
dialog.dismiss();
if(apps.size()>0){
mKillVirusResult.setTextColor(Color.RED);
mKillVirusResult.setText("扫描完毕!发现病毒"+apps.size()+"个"+","+"请及时清理"); for(final VirusApp app:apps){
//有病毒
View view=View.inflate(KillVirusActivity.this,R.layout.app_virus_info_item,null);
view.setClickable(true);
view.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
//卸载程序
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:"
+ app.getmAppVirusName()));
startActivity(intent); }
}); ImageView appIcon=(ImageView) view.findViewById(R.id.iv_app_icon);
TextView appName=(TextView) view.findViewById(R.id.tv_app_name);
TextView appDesc=(TextView)view.findViewById(R.id.tv_app_virus_desc); appIcon.setBackground(app.getmAppVirusIcon());
appName.setText(app.getmAppVirusName());
appDesc.setText(app.getmAPPVirusDesc()); mContainer.addView(view);
} }else if(apps.size()==0){
mKillVirusResult.setText("扫描完毕!恭喜没有发现病毒。"); } super.onPostExecute(result);
} @Override
protected Void doInBackground(Void... params) {
int total=0;
//获得数据库操作对象
VirusDao virusDao=new VirusDao(); //获得设备上全部应用的签名
for(PackageInfo info:packageInfos){
total++; Signature[] signature=info.signatures;
try {
String md5=Md5Util.encode(signature[0].toString());
desc=virusDao.findVirus(md5);
Log.i("杀毒MD5<<<", md5);
desc=virusDao.findVirus(md5);
} catch (Exception e) {
// TODO: handle exception
}
//Log.i("杀毒<<<", (signature[0]).toString());
//签名用MD5编码获得MD5加密后的应用的签名信息 //Log.i("杀毒MD5<<<", md5);
//查询本地病毒签名数据库
// desc=virusDao.findVirus(md5);
if(desc!=null){//查询到病毒 VirusApp app=new VirusApp();
//获得应用的图标
Drawable drawable=pm.getApplicationIcon(info.applicationInfo);
app.setmAppVirusIcon(drawable);
//获得应用名
String appName=(String) pm.getApplicationLabel(info.applicationInfo);
app.setmAppVirusName(appName);
//获得该应用的病毒描写叙述
app.setmAPPVirusDesc(desc);
apps.add(app);
app=null;
//publishProgress(total,app);
}else{
Log.i("杀毒MD5<<<","不是病毒"+total);
}
}
//progressBar.setProgress(total); try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }.execute(); }
该逻辑处理相应的activity布局界面:
<?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="match_parent"
android:layout_height="35dp"
android:background="@drawable/ll_title_bg"
android:gravity="center"
android:text="手机病毒查杀" /> <TextView
android:id="@+id/tv_kill_virus_result"
android:layout_width="match_parent"
android:layout_height="125dp"
android:gravity="center"
android:background="@drawable/ll_title_bg" /> <ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" > <LinearLayout
<span style="color:#ff0000;"> android:id="@+id/ll_container"</span>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView> </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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="病毒扫描中..."
android:textSize="15sp" /> </LinearLayout>
实现动态扫描并载入数据的整个Activity代码:
package com.example.yqqmobilesafe; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView; import com.example.yqqmobilesafe.db.dao.VirusDao;
import com.example.yqqmobilesafe.domain.VirusApp;
import com.example.yqqmobilesafe.utils.CopyFileToSystem;
import com.example.yqqmobilesafe.utils.Md5Util;
//本地病毒查杀
public class KillVirusActivity extends Activity {
private LinearLayout<span style="color:#ff0000;"> mContainer</span>;
private TextView mKillVirusResult;
private PackageManager pm;
private ProgressBar progressBar;
private List<PackageInfo> packageInfos;
public KillVirusActivity() { }
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_kill_virus);
<span style="color:#ff0000;">mContainer</span>=(LinearLayout) this.findViewById(R.id.ll_container);
mKillVirusResult=(TextView) this.findViewById(R.id.tv_kill_virus_result);
//progressBar=(ProgressBar) this.findViewById(R.id.pb_scanning_virus);
copyVirusDB();//拷贝本地病毒签名到系统文件夹
scanVirus();
super.onCreate(savedInstanceState);
}
/**
* 扫描病毒 并动态显示在界面
*/
private void scanVirus(){
new AsyncTask<Void,Object, Void>() {
List<VirusApp> apps=new ArrayList<VirusApp>();
String desc=null;
Dialog dialog=new Dialog(KillVirusActivity.this);
View viewKilling=View.inflate(KillVirusActivity.this,R.layout.killing_dialog,null);
@Override
protected void onPreExecute() {
mKillVirusResult.setText("正在扫描中。请稍等...");
dialog.setCancelable(false);
dialog.setContentView(viewKilling);
dialog.show();
pm=getPackageManager();
packageInfos=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES|PackageManager.GET_SIGNATURES);
// progressBar.setMax(packageInfos.size());
super.onPreExecute();
} @Override
protected void onPostExecute(Void result) {
dialog.dismiss();
if(apps.size()>0){
mKillVirusResult.setTextColor(Color.RED);
mKillVirusResult.setText("扫描完毕! 发现病毒"+apps.size()+"个"+","+"请及时清理"); for(final VirusApp app:apps){
//有病毒
View view=View.inflate(KillVirusActivity.this,R.layout.app_virus_info_item,null);
view.setClickable(true);
view.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
//卸载程序
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:"
+ app.getmAppVirusName()));
startActivity(intent); }
}); ImageView appIcon=(ImageView) view.findViewById(R.id.iv_app_icon);
TextView appName=(TextView) view.findViewById(R.id.tv_app_name);
TextView appDesc=(TextView)view.findViewById(R.id.tv_app_virus_desc); appIcon.setBackground(app.getmAppVirusIcon());
appName.setText(app.getmAppVirusName());
appDesc.setText(app.getmAPPVirusDesc()); <span style="color:#ff0000;">mContainer.addView(view);</span>
} }else if(apps.size()==0){
mKillVirusResult.setText("扫描完毕!恭喜没有发现病毒! "); } super.onPostExecute(result);
} @Override
protected Void doInBackground(Void... params) {
int total=0;
//获得数据库操作对象
VirusDao virusDao=new VirusDao(); //获得设备上全部应用的签名
for(PackageInfo info:packageInfos){
total++; Signature[] signature=info.signatures;
try {
String md5=Md5Util.encode(signature[0].toString());
desc=virusDao.findVirus(md5);
Log.i("杀毒MD5<<<", md5);
desc=virusDao.findVirus(md5);
} catch (Exception e) {
// TODO: handle exception
}
//Log.i("杀毒<<<", (signature[0]).toString());
//签名用MD5编码获得MD5加密后的应用的签名信息 //Log.i("杀毒MD5<<<", md5);
//查询本地病毒签名数据库
// desc=virusDao.findVirus(md5);
if(desc!=null){//查询到病毒 VirusApp app=new VirusApp();
//获得应用的图标
Drawable drawable=pm.getApplicationIcon(info.applicationInfo);
app.setmAppVirusIcon(drawable);
//获得应用名
String appName=(String) pm.getApplicationLabel(info.applicationInfo);
app.setmAppVirusName(appName);
//获得该应用的病毒描写叙述
app.setmAPPVirusDesc(desc);
apps.add(app);
app=null;
//publishProgress(total,app);
}else{
Log.i("杀毒MD5<<<","不是病毒"+total);
}
}
//progressBar.setProgress(total); try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }.execute(); } /**
* 拷贝本地病毒库数据库到app文件夹
*/
private void copyVirusDB(){
new AsyncTask<Void,Void,Void>(){ @Override
protected Void doInBackground(Void... params) {
//获得要复制到目的地的文件
File file=new File(getFilesDir(),"antivirus.db");
if(file.exists()&&file.length()>0){ }else{
//获得文件输入流
InputStream is=null;
try {
is=getResources().getAssets().open("antivirus.db");
CopyFileToSystem.copyFile(is, file.getAbsolutePath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
return null;
} }.execute(); } }
android异步任务载入数据界面实现的更多相关文章
- android listView 滑动载入数据 该数据是服务端获取的
package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import ja ...
- Android 异步加载数据 AsyncTask异步更新界面
官方文档: AsyncTask enables proper and easy use of the UI thread. This class allows to perform backg ...
- Android fragment 切换载入数据卡顿问题
接着上一篇项目的进度.上一篇讲了怎样利用fragment来实现下拉菜单.公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法.但载入的数据太多.用户从一个界面 ...
- Android异步载入全解析之使用AsyncTask
Android异步载入全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理.更能够提高他们运行的效率.优化整个App.当然我们能够自己 ...
- Android异步载入全解析之使用多线程
异步载入之使用多线程 初次尝试 异步.异步,事实上说白了就是多任务处理.也就是多线程执行.多线程那就会有各种问题,我们一步步来看.首先.我们创建一个class--ImageLoaderWithoutC ...
- android中listview分页载入数据
前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...
- Android异步载入全解析之IntentService
Android异步载入全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask.再不济也使用的Thread,那么这个Intent ...
- Android学习笔记_36_ListView数据异步加载与AsyncTask
一.界面布局文件: 1.加入sdcard写入和网络权限: <!-- 访问internet权限 --> <uses-permission android:name="andr ...
- android 网络异步加载数据进度条
ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...
随机推荐
- TCP/IP笔记 应用层(3)——HTTP
1. URL URL(Uniform Resource Locator) 相当于一个文件名在网络范围的扩展. 1.1 格式 schema://host[:port#]/path/.../[?query ...
- wpf数据自动树结构
在项目中,时常会遇到存在上下级关系的数据.在呈现方面,按照传统方法,不得不组装TreeNode之后添加到TreeView 中,已实现树形数据的显示.如果项目中需要多处使用树,毫无疑问这将存在巨大的代码 ...
- phonegap 4.2 环境搭建 及 项目创建 运行
安装Java 和 ADT 1.首先要安装java运行环境jdk,这个可以自行到官网下载.百度也有下载连接:( http://www.baidu.com/s?tn=baidu&ie=utf-8& ...
- 【产品体验】支付宝Alipay9.0
自己摸索中也要学习别人的分析,生命不息,学习不止~~ 支付宝9.0新界面如下图所示——Logo变了,上方突出了“附近”入口,下方新增了“商家”“朋友”两个一级tab,新增了亲情账户,财富界面进行了改 ...
- open files
/* * * Copyright (c) International Business Machines Corp., 2001 * * This program is free software; ...
- Contest20140710 eagleeggs
eagleeggs|eagleeggs.in|eagleeggs.out 题目描述: 共有N个硬度相同的鹰蛋,硬度是一个整数(并且已知其不大于H),表示这个蛋从天上掉下来不摔碎的最大高度.为了找出这个 ...
- strong ,weak
有时我们写个代码开源出来给别人用时,会被其他开发者抱怨编译不了,很多情况是版本的问题,尤其现在ARC的出现后关于weak,strong的问题让人头疼.有个开源代码这里做的很不错,就是MBProgres ...
- Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- 【CF】244C Checkposts
题目需要求啥很明确了.主要思想是先计算机联通块,然后每个块内找到一个最小值(以及该值的次数).最小值和结果1,次数乘积为结果2.联通块tarjan可解. /* 427C */ #include < ...