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

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 [email protected]/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 [email protected]/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 [email protected]/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接口中的方法

时间: 2024-12-15 23:12:46

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

一个简单的回调(例子)

1.声明一个回调Interface: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... objects ); } 2.回调的地方继承回调,实现回调的方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe

Android实战之 万能的接口回调

转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学的计算机,可是对软件开发却并不感兴趣. 毕业后看同学们或培训Android或培训IOS 4个月后都非常快找到了不错的工作.令我感到非常诧异,也非常羡慕!于是我做出了人生中重要的一个决定.開始学习Android.因为本人比較穷,所以选择自学. 学习的过程实为不易,从刚開始的一无所知时的苦苦挣扎,到学有所得后的应

JAVA异步加回调的例子

package com.sunchao.callback; /** * callback interface * @author Administrator * */ public interface CallBack { /** * execute the callback method * @param objects make the asyn execute result as the parameter of callback method */ public void execute

学习写接口回调

在做百度地图反地理编码时(坐标转地址), 需要自己写一个结果接口回调,一般在网络请求,点击事件,以及一些异步操作时,需要用到接口回调. 位置管理者,里面有位置监听: /** * 自己写的位置管理者 * Created by xhj on 16-1-27. */ public class TrackerLocationManager { protected TrackerLocationManager() { } /** * 位置管理者实例 */ private static TrackerLoc

接口回调 入门

有三个类,他们之间的关系如下: interface A class B implements A class C implements A 要获得B类的对象,一般的写法是:B b = new B(); 还有一种写法,叫接口回调,写法是:A b = new B(); 意思是,用接口的变量b,去引用B的对象.接着就可以用b去调用B中的方法.但调用的方法必须是接口里定义了的. 接口回调带来的最大好处就是灵活性,例如必要时可以直接用b去引用C的对象:b = new C(); 例子 interface P

Python怎么测试异步接口

当业务处理比较耗时时, 接口一般会采用异步处理的方式, 这种异步处理的方式又叫Future模式. 一般流程 当你请求一个异步接口,接口会立刻返回你一个结果告诉你已经开始处理,结果中一般会包含一个任务id类似的东西用于追踪结果, 另外会提供一个查询结果的接口, 当结果未处理完查询接口会返回相应的"未完成"状态, 如果已经处理完,则会返回相应的数据. 处理方法 异步接口我们一般采取轮询的方法,每隔一定时间间隔取请求一下查询结果的接口,直到接口返回的状态是已完成/查询到指定数据或超时 如果异

Android接口回调机制

开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A可以继续先做别的事情. 那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题. 代码中比如最常用的: 一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法 Button btn = new Button(this); btn

(转)Android之接口回调机制

开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A可以继续先做别的事情. 那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题. 代码中比如最常用的: 一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法. Button btn = new Button(this); bt

Android实战之接口回调

由于自己以前也困于抽象.接口等"吓人"的东西,网上又缺乏在项目中实战运用的讲解,下面我就斗胆把自己的理解和大家交流一下下. 本人也算是自学"成才",呵呵,大学时虽然学的计算机,但是对软件开发却并不感兴趣.毕业后看同学们或培训Android或培训IOS 4个月后都很快找到了不错的工作,令我感到很诧异,也很羡煞!于是我做出了人生中重要的一个决定,开始学习Android,由于本人比较穷,所以选择自学.学习的过程实为不易,从刚开始的一无所知时的苦苦挣扎,到学有所得后的应对有