1. Command设计模式

图形编程 图形库 

一个按钮的强大:登录,注册,CRUD....体现出灵活性与扩展性,其实就是耦合度低.

1.1. 耦合度低

比方:手机与电池

 

Android 基础理论 day02_android高薪

1.2. 接口interface

接口引用可以降低耦合度 

案例:GoodDao

 

 

Android 基础理论 day02_android高薪_02

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


比方:洗衣服


 

Android 基础理论 day02_android高薪_03

案例:短信备份

开发要点:

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();