昨天在学习回调的时候,发现了其独特的魅力之处,它将业务代码逻辑和我们的工具类耦合性大大降低了。

应用场景:在实际开发中,经常会随着用户的需求的改变而对对话框的样式进行相应修改,在短信的备份过程中,往往需要给用户显示一个对话框,以提示用户进度。

常见的回调的步骤分为4步:

//1,定义一个接口
//2,定义业务逻辑的抽象2个方法
//3,传递一个实现了第一步接口的实现类的对象进来(实现了未实现的抽象方法(将抽象的逻辑具体话))
//4,在合适的地方去调用实现类对象中,已经实现好的方法

代码如下:

 1 public class SmsUtil {
 2     private static Cursor cursor;
 3     private static FileOutputStream fos;
 4     private static int index = 0;
 5     /**
 6      * @param path    备份到的文件路径
 7      * @param ctx     上下文环境
 8      * @param pd    显示进度条的对话框
 9      */
10     public static void backUp(String path,Context ctx,SmsCallBack callBack) {
11         //1,在指定路径下去创建文件
12         File file = new File(path);
13         try {
14             fos = new FileOutputStream(file);
15             
16             //2,准备要备份的数据,内容解析者要上下文环境
17             cursor = ctx.getContentResolver().query(Uri.parse("content://sms/"), 
18                     new String[]{"address","date","type","body"}, 
19                     null, null, null);
20           //设置对话框中进度条100%短信条数
21             if(callBack!=null){
22                 callBack.setMax(cursor.getCount());
23             }
24             
25             //3,获取xml的序列化器,做写入xml节点操作
26             XmlSerializer newSerializer = Xml.newSerializer();
27             //向那个文件写入数据
28             newSerializer.setOutput(fos,"utf-8");
29             newSerializer.startDocument("utf-8", true);
30             //设置跟节点(名空间,名称)
31             newSerializer.startTag(null, "smss");
32             while(cursor.moveToNext()){
33                 //在循环遍历过程中,获取每一条短信,四个字段,对应着就是xm中的一个节点
34                 newSerializer.startTag(null, "sms");
35                 
36                 newSerializer.startTag(null, "address");
37                 newSerializer.text(cursor.getString(cursor.getColumnIndex("address")));
38                 newSerializer.endTag(null, "address");
39                 
40                 newSerializer.startTag(null, "date");
41                 newSerializer.text(cursor.getString(cursor.getColumnIndex("date")));
42                 newSerializer.endTag(null, "date");
43                 
44                 newSerializer.startTag(null, "type");
45                 newSerializer.text(cursor.getString(cursor.getColumnIndex("type")));
46                 newSerializer.endTag(null, "type");
47                 
48                 newSerializer.startTag(null, "body");
49                 newSerializer.text(cursor.getString(cursor.getColumnIndex("body")));
50                 newSerializer.endTag(null, "body");
51                 
52                 newSerializer.endTag(null, "sms");
53                 
54                 //叠加进度条百分比
55                 index++;
56 
57                     if(callBack!=null){
58                                //设置对话框的最大进度
59                     callBack.setProgress(index);
60                 }
61                 
62                 Thread.sleep(500);
63             }
64             newSerializer.endTag(null, "smss");
65             newSerializer.endDocument();
66         } catch (Exception e) {
67             e.printStackTrace();
68         }finally{
69             try {
70                 if(cursor!=null && fos!=null){
71                     cursor.close();
72                     fos.close();
73                 }
74             } catch (IOException e) {
75                 e.printStackTrace();
76             }
77         }
78     }
79     public interface SmsCallBack{
80         //1,设置总进度方法
81         public void setMax(int max);
82         //2,设置当前进度的方法
83         public void setProgress(int progress);
84     }
85 }                
View Code

这样在调用工具类实现短信备份功能的时候,就可以很方便的自定义对话框样式,而不需要再去修改业务逻辑。

	SmsUtil.backup(sdPath, getApplicationContext(),new SmsCallBack() {
			public void setProgress(int progress) {
									
			}

			public void setMax(int max) {
									
			}
	、});

  

posted on 2015-08-11 01:19  ADVANCE_ae  阅读(379)  评论(0编辑  收藏  举报