android技巧(五)一个异步+接口回调的例子

时间:2022-08-27 16:11:18
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接口中的方法