public class DataBaseUtils {
// 当前数据库地址
private String DB_PATH;
// 备份后数据库保存地址
private String DB_BACKUP_PATH;
private Context context;
private MessageShow ms;
// 备份成功状态
private final int BACKUP_OK = 1;
// 备份失败状态
private final int BACKUP_FAIL = -1;
// 恢复成功状态
private final int RECOVER_OK = 2;
// 恢复失败状态
private final int RECOVER_FAIL = -2; public interface MessageShow{ public void onPepare();
public void onSuccess();
public void onFail(); } public DataBaseUtils(Context context) {
this.context = context;
} /**
* @Title: doDataBackUp
* @Description: TODO(数据备份)
* @param
* @return void 返回类型
* @author fenglei015@deppon.com/273219
* @throws
*/
public void doDataBackUp(String DB_PATH, String DB_BACKUP_PATH,MessageShow ms) {
this.DB_PATH = DB_PATH;
this.DB_BACKUP_PATH = DB_BACKUP_PATH;
this.ms=ms;
new BackUpTask().execute();
} /**
* @ClassName: BackUpTask
* @Description: TODO(数据库备份异步任务)
* @author fenglei015@deppon.com/273219
* @date 2015-12-25 上午11:10:58
*
*/
@TargetApi(Build.VERSION_CODES.CUPCAKE)
class BackUpTask extends AsyncTask<String, Void, Integer> { @Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if(ms!=null) {
ms.onPepare();
}
} @Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub // 默认路径 /data/data/(包名)/databases/*.db
File dbFile = context.getDatabasePath(DB_PATH);
File exportDir = new File(DB_BACKUP_PATH);
int result = 0;
if (!exportDir.exists()) {
exportDir.mkdirs();
}
File backup = new File(exportDir, dbFile.getName());
try {
backup.createNewFile();
fileCopy(dbFile, backup);
result = BACKUP_OK;
} catch (Exception e) {
Log.e("backup_error", e.getMessage());
result = BACKUP_FAIL;
} return result; } @Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
switch (result) {
case BACKUP_OK:
if(ms!=null) {
ms.onSuccess();
}
break; case BACKUP_FAIL:
if(ms!=null) {
ms.onFail();
}
break;
}
} } /**
* @Title: fileCopy
* @Description: TODO(文件拷贝方法)
* @param @param dbFile
* @param @param backup
* @param @throws IOException 设定文件
* @return void 返回类型
* @author fenglei015@deppon.com/273219
* @throws
*/
private void fileCopy(File dbFile, File backup) throws IOException {
// TODO Auto-generated method stub
FileChannel inChannel = new FileInputStream(dbFile).getChannel();
FileChannel outChannel = new FileOutputStream(backup).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("fileCopy_error", e.getMessage());
} finally {
if (inChannel != null) {
inChannel.close();
}
if (outChannel != null) {
outChannel.close();
}
}
}
}

调用DataBaseUtils中的doDataBackUp(String DB_PATH, String DB_BACKUP_PATH,MessageShow ms) 方法

public class MainActivity extends Activity {
private String DB_BACKUP_PATH=Environment.getExternalStorageDirectory()+"/feng_contactsBackup";
private String DATABASE_PATH=Environment.getExternalStorageDirectory() + "/ttttest.db"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseUtils bru=new DatabaseUtils(MainActivity.this);
bru.doDataBackUp(DB_PATH, DB_BACKUP_PATH,new MessageShow() { @Override
public void onSuccess() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,"success", Toast.LENGTH_LONG).show();
}
@Override
public void onPepare() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,"Pepare", Toast.LENGTH_LONG).show();
}
@Override
public void onFail() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,"Fail", Toast.LENGTH_LONG).show();
}
}); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("DB_ERROR", "Get bean dao error cause by " + e.getMessage());
}
}
}

对整个异步回调使用的理解:

1.class   A,class   B   
  2.class   A实现接口callback
  3.class   B拥有一个参数为callback接口类型的函数bMethod(callback cb)
  4.class   A运行时调用class   B中的函数bMethod(callback cb),以自身传入参数   
  5.class   B已取得A,就可以随时回调A所实现的callback接口中的方法

android技巧(五)一个异步+接口回调的例子的更多相关文章

  1. Android实战之 万能的接口回调

    转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学 ...

  2. android app使用微信登录接口回调没有被执行的问题研究

    本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行 应用的包名是com.kimi.searcher 首先,确认微信点击授 ...

  3. JAVA异步加回调的例子

    package com.sunchao.callback; /** * callback interface * @author Administrator * */ public interface ...

  4. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  5. js同步、异步、回调的执行顺序以及闭包的理解

    首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...

  6. Python怎么测试异步接口

    当业务处理比较耗时时, 接口一般会采用异步处理的方式, 这种异步处理的方式又叫Future模式. 一般流程 当你请求一个异步接口,接口会立刻返回你一个结果告诉你已经开始处理,结果中一般会包含一个任务i ...

  7. Android接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  8. (转)Android之接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  9. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

随机推荐

  1. 里面的div怎么撑开外面的div,让高度自适应

    关于容器高度自适应的兼容性问题.1.有些时候,我们希望容器有一个固定高度,但当其中的内容多的时候,又希望高度能够自适应,也即容器在纵向能被撑开,且如果有背景,也能够自适应.在一般情况下,使用min-h ...

  2. forever让nodejs应用后台执行

    nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js & ...

  3. [C语言入门笔记]分支结构与数组

    分支结构与数组 什么是分支结构? 分支结构是用户或者程序可以选择下一步执行哪个语句 分支结构有哪些? If If Else If Else If Switch 在初学者的学习过程中第一种和第二种比较普 ...

  4. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  5. AngularJS的$watch用法

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...

  6. bean生命周期

    一.Bean的定义Spring通常通过配置文件定义Bean.如:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:s ...

  7. python基础教程-第三章-使用字符串

    本章将会介绍如何使用字符串何世华其他的值(如打印特殊格式的字符串),并简单了解下利用字符串的分割.联接.搜索等方法能做些什么 3.1 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格 ...

  8. 线程隔离ThreadLocal

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  9. 【图像处理】【SEED-VPM】4.串口调试信息

    —————————————————————————————————————————————————————————————————————— 串口返回正确的信息 Booting PSP Boot Lo ...

  10. JSP页面中的精确到秒的时间控件

    技术:Struts1+jsp+MSql 需求:ncmgt网络监控系统中显示用户的操作日志,并且根据操作时间查询用户的详细操作记录.时间精确到秒 大致效果如下.上图! 大家可以清晰的看到.红色画线部分就 ...