短信备份类,我在上一节基本全部讲完了,代码的迭代开发,是需要的,开发完就需要做代码重构,解耦
可学到的知识点
①接口的应用
②简单的ui线程使用runOnUiThread
上一节,讲到 如果公司老板频繁的话UI需求的话,对于一个项目组来说是很头痛的,因为基本是一个人负责UI,一个人负责业务类的。所以为了解耦,我们要改造Smsutils
因为在类中经常变动的就是 UI,开始备份的时候,设置进度的最大值 ,备份过程中,增加进度 所以我们就把经常变动的抽出来定义成接口,让使用者选择传递什么样的值。
/** * 备份短信的回调接口 */ public interface BackUpCallBack { /** * 开始备份的时候,设置进度的最大值 * * @param max * 总进度 */ public void beforeBackup(int max); /** * 备份过程中,增加进度 * * @param progress * 当前进度 */ public void onSmsBackup(int progress); }
当工具类走到这一步,因为接口的抽象方法在调用者那里写着,所以最后还是执行了 调用者类中的
pd.setProgress(progress);
// pd.setProgress(process); callBack.onSmsBackup(process);走到这里的时候,确实也是调用了
pd.setMax(max);这时候 progressbar 就会出现了。就这样解耦了
因为备份短信的时候,顾虑到可能用户的短信比较多,所以开启了一个子线程进行更新,然后又要使用到Toast 这个时候 简单的使用UI更新 就会使用到他
runOnUiThread
runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(SmsActivity.this, "备份成功", 0).show(); } });
SmsUtils.java 备份短信工具类
package com.example.Darkbutton.Utils; import java.io.File; import java.io.FileOutputStream; import org.xmlpull.v1.XmlSerializer; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.util.Xml; /** * 短信的工具类 * */ public class SmsUtils { /** * 备份短信的回调接口 */ public interface BackUpCallBack { /** * 开始备份的时候,设置进度的最大值 * * @param max * 总进度 */ public void beforeBackup(int max); /** * 备份过程中,增加进度 * * @param progress * 当前进度 */ public void onSmsBackup(int progress); } public static void backupSms(Context context, BackUpCallBack callBack) throws Exception { // ProgressDialog pd=new ProgressDialog(context); // pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // pd.setMessage("正在备份数据"); // pd.show(); File file = new File(Environment.getExternalStorageDirectory(), "backup.xml"); FileOutputStream fos = new FileOutputStream(file); ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://sms/"); Cursor cursor = resolver.query(uri, new String[] { "body", "address", "type", "date" }, null, null, null); // 开始备份的时候,设置进度条的最大值 int max = cursor.getCount(); // pd.setMax(max); callBack.beforeBackup(max); // 把用户的短信一条一条读出来,按照一定的格式写到文件里 XmlSerializer serializer = Xml.newSerializer(); // 初始化生成器 serializer.setOutput(fos, "utf-8"); serializer.startDocument("utf-8", true); serializer.startTag(null, "smss"); serializer.attribute(null, "max", max + ""); int process = 0; while (cursor.moveToNext()) { Thread.sleep(500); String body = cursor.getString(0); String address = cursor.getString(1); String type = cursor.getString(2); String date = cursor.getString(3); serializer.startTag(null, "sms"); serializer.startTag(null, "body"); serializer.text(body); serializer.endTag(null, "body"); serializer.startTag(null, "address"); serializer.text(address); serializer.endTag(null, "address"); serializer.startTag(null, "type"); serializer.text(type); serializer.endTag(null, "type"); serializer.startTag(null, "date"); serializer.text(date); serializer.endTag(null, "date"); serializer.endTag(null, "sms"); // 备份过程中,增加进度 process++; // pb.setProgress(process); // pd.setProgress(process); callBack.onSmsBackup(process); } cursor.close(); serializer.endTag(null, "smss"); serializer.endDocument(); fos.close(); // pd.dismiss(); } }
package com.example.Darkbutton; import com.example.Darkbutton.Utils.SmsUtils; import com.example.Darkbutton.Utils.SmsUtils.BackUpCallBack; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class SmsActivity extends Activity implements OnClickListener { private Button button1; private ProgressDialog pd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sms_activity); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(this); } @Override public void onClick(View v) { pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("正在备份短信"); pd.show(); new Thread(){ @Override public void run() { try { SmsUtils.backupSms(SmsActivity.this,new BackUpCallBack() { @Override public void onSmsBackup(int progress) { pd.setProgress(progress); } @Override public void beforeBackup(int max) { pd.setMax(max); } }); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(SmsActivity.this, "备份成功", 0).show(); } }); } catch (Exception e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(SmsActivity.this, "备份失败", 0).show(); } }); }finally{ pd.dismiss(); } }; }.start(); } }
<uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/>