1. Command设计模式
图形编程 图形库
一个按钮的强大:登录,注册,CRUD....体现出灵活性与扩展性,其实就是耦合度低.
1.1. 耦合度低
比方:手机与电池
1.2. 接口interface
接口引用可以降低耦合度
案例:GoodDao
1.3. 图形库Button模拟示意
使用Command设计模式开发一个按钮步骤 。低耦合在开发图形控件 command设计模式/菜单
开发要点
1.申明接口
On....Listener
public static interface OnClickListener {
public void onClick(View view);
}
2.
控件内部申明接口引用
//低耦合引用
private OnClickListener listener;
public void setOnListener(OnClickListener listener) {
this.listener = listener;
}
3.
系统调用
...
if (this.listener != null) {
this.listener.onClick(view);
}
....
调用方式
MyButton login = new MyButton();
login.setOnListener(new OnClickListener() {
@Override
public void onClick(View view) {
// 登录
System.out.println("登录1000");
}
});
MyButton register = new MyButton();
register.setOnListener(new OnClickListener() {
@Override
public void onClick(View view) {
// 注册...
System.out.println("注册1000");
}
});
// 系统调用
login.work(null);
register.work(null);
2. 回调CallBack函数
2.1. 理解
比方:你妈在炒菜(耗时),你到同学家打游戏,你写了一个函数(菜做好了打电话)
异步概念:你会等菜做好吗?煲个汤要3个小时!!!此时分头行动
callback函数在微软的官方手册中是这样定义callback函数的:“callback函数是由应用程序
定义而由操作系统调用的函数”。
这里有两点需要注意:
第一点,我们写回调函数不是给自己调用的,而是准备给系统在将来某一时刻调用的;
第二点,一般的函数,都是你自己去调用。 而callback函数是由系统调用的。我们应该知道系统在什么情形下会调用我们写的回调函数。
在Android开发中有两种方式
1.AsyncTask
2.Thread+Handler
//ANR Application not response用户无响应异常 卡
某段代码比较耗时代码用以上方法进行处理<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2.2. Android的回调
如:四大组件的学习
##########学习关键点:着重掌握回调函数的条件
<span style="color:#330033;">public class MyActivity extends Activity {
// 当Activity被创建的时候调用
// 条件:创建
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// findViewById
// setOn...
}
// 当Activity被销毁的时候调用
@Override
protected void onDestroy() {
super.onDestroy();
}
}</span>
经验:
1.组件 extends 组件名
2.生命周期/回调方法
3.对应标签进行注册
2.3. AsyncHttpClient
封装了Http与线程
Get
String url = "http://192.168.10.100:8080/web/";
// 创建客户端类
AsyncHttpClient client = new AsyncHttpClient();
// get请求 非阻塞/异步
client.get(url, // 路径
new AsyncHttpResponseHandler() {
//回调函数:条件:请求失败的情况下
@Override
public void onFailure(int resCode, Header[] header, byte[] result, Throwable e) {
super.onFailure(resCode, header, result, e);
resultText.setText("请求失败");
}
//回调函数:条件:请求成功的情况下 200 主线程:可以直接操作控件
@Override
public void onSuccess(int resCode, Header[] header, byte[] result) {
super.onSuccess(resCode, header, result);
try {
String res=new String(result,"UTF-8");
resultText.setText(res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}// 响应处理类
);
Post
// 创建客户端类
AsyncHttpClient client = new AsyncHttpClient();
// 创建表单
RequestParams params = new RequestParams();
params.put("username", userName);
params.put("password", password);
// post请求 非阻塞/异步
client.post(url, // 路径
params,// 表单
new AsyncHttpResponseHandler() }
);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
文件上传
// 创建客户端类
AsyncHttpClient client = new AsyncHttpClient();
// 创建表单
RequestParams params = new RequestParams();
params.put("filename", "文件名");
params.put("filedes", "文件描述");
try {
params.put("formfile", new File(filePath));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
// post请求 非阻塞/异步
client.post...
AsyncHttpResponseHandler的事件处理需要在回调方法里面
2.4. WebView
案例:载入html的帮助说明
载入html代码
resultWebView.loadData(res,//网页源代码html内容
"text/html",//多媒体类型
"UTF-8"//编码
);
载入网址
// 载入网址
resultWebView.loadUrl("http://192.168.10.100:8080/");
2.4.1. 修改WebView载入行为
WebViewClient 主要帮助WebView处理各种通知、请求事件的
// 修改行为 不要打开系统浏览器,而是把内容显示在当WebView
resultWebView.setWebViewClient(new WebViewClient() {
// 条件:开始载入网页
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
dialog = new ProgressDialog(WebViewActivity1.this);
dialog.setTitle("传智浏览器 提示");
dialog.setMessage("正在拼命加载中...");
// 开始
dialog.show();
}
// 条件:结束载入网页
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 关闭
dialog.dismiss();
}
});
经验:1.改变属性 set 2.重写回调方法 (android)
2.4.2. 显示载入进度
WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如
// 设置WebChromeClient实例
resultWebView.setWebChromeClient(new WebChromeClient() {
// 回调函数:条件:只要进度发生改 就调用
@Override
public void onProgressChanged(WebView view, int newProgress// 最新进度
) {
System.out.println("onProgressChanged newProgress= " + newProgress);
if (newProgress < 100) {
if (mProgressBar.getVisibility() != View.VISIBLE) {
mProgressBar.setVisibility(View.VISIBLE);
}
mProgressBar.setProgress(newProgress);
} else {
mProgressBar.setVisibility(View.GONE);
mProgressBar.setProgress(0);
}
super.onProgressChanged(view, newProgress);
}
});
2.5. AsyncTask
比方:洗衣服
案例:短信备份
开发要点:
l 如果项目里面遇到卡可以使用AsynTask优化耗时代码
l 线程 new Thread().start() 所 new AsynTask().execute();!!!
new AsyncTask<Void, Integer, // 进度的类型
Void>() {
// 任务开始前
@Override
protected void onPreExecute() {
super.onPreExecute();
...显示
}
// 任务执行中.
@Override
protected Void doInBackground(Void... params) {
for (int i = 1; i <= number; i++) {
if (!isRunning) {
return null;
}
System.out.println("当前备份第" + i + "/" + number + "条");
// 发布进度
publishProgress(i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
// 任务完成
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (isRunning) {
mProgressBar.setVisibility(View.INVISIBLE);
status.setText("备份完成 本次备份" + number + "条");
} else {
status.setText("备份被取消");
}
}
// 回调函数 进度变化时被调用 条件:publisProgress();
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mProgressBar.setProgress(values[0]);
status.setText("当前备份第" + values[0] + "/" + number + "条");
}
}.execute();