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. API -- java.lang.Integer

    java.lang Class Integer static Integer valueOf(int i) Returns an Integer instance representing the s ...

  2. 日常积累之JSON.stringify和JSON.parse substr

    1.substr(start,len) 从字符串中读取内容,第一个参数是读取的首位置,如果为负数,则从末尾倒数计数. 第二个参数是要读取的长度. eg: var str = "silence ...

  3. Sprint1(第四天11.17)

    Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http://www.cnblogs.com/qu ...

  4. (45) Manifest文件

    这个是一模块主要描述和设置的文件,下面进行讲解一下{    'name': "A Module",    'version': '1.0',    'depends': ['bas ...

  5. Linux 系统把英文修改成中文界面

    1.一般安装后的linux系统都是英文的界面,网上查了一下各种说法都有,我只做了如下的配置就好了,下载个中文包,改一下i18n就完事了,并没有那么复杂 下面上图文: 目前是英文的界面 2.下载个中文包 ...

  6. svn快速教程

    本文拷贝自网址:http://www.subversion.org.cn/?action-viewnews-itemid-1 如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关 ...

  7. XObject.java 对象还没写完,希望电脑不会丢失。坏笑,早点见。

    /*面向对象强调的是对象, 面向过程强调的是功能行为,打开行为,关闭行为,执行行为,把多个行为封装成对象执行更强大的功能就是面向对象,是把多个函数, 多 个行为封装在一起,单一的函数执行对象的功能太困 ...

  8. C++ 在容器中存放函数指针

    注意,对一般c++ 98标准编译器而言,容器泛型模板是不支持直接存放函数指针的.需要typedef将函数指针重命名. 比如,一个void返回值参数也为void的函数指针,需要 typedef void ...

  9. zoom和transform:scale的区别

    小tips: zoom和transform:scale的区别 这篇文章发布于 2015年11月3日,星期二,00:52,归类于 css相关. 阅读 7876 次, 今日 8 次 by zhangxin ...

  10. 关于BigDecimal 的计算

    BigDecimal 构造方式主要包括4种: 支持double.int.long等类型计算,废话少说,直接上代码 import java.math.BigDecimal; public class B ...