Android 基础理论 day02

来源:互联网 发布:python微信公众号爬虫 编辑:程序博客网 时间:2024/04/27 22:52


1. Command设计模式

图形编程 图形库 

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

1.1. 耦合度低

比方:手机与电池

 

1.2. 接口interface

接口引用可以降低耦合度 

案例:GoodDao

 

 

1.3. 图形库Button模拟示意

使用Command设计模式开发一个按钮步骤 。低耦合在开发图形控件  command设计模式/菜单

开发要点

1.申明接口

On....Listenerpublic 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() {@Overridepublic void onClick(View view) {// 登录System.out.println("登录1000");}});MyButton register = new MyButton();register.setOnListener(new OnClickListener() {@Overridepublic 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.AsyncTask2.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被创建的时候调用// 条件:创建@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// findViewById// setOn...}// 当Activity被销毁的时候调用@Overrideprotected 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() {//回调函数:条件:请求失败的情况下@Overridepublic void onFailure(int resCode, Header[] header, byte[] result, Throwable e) {super.onFailure(resCode, header, result, e);resultText.setText("请求失败");}//回调函数:条件:请求成功的情况下 200  主线程:可以直接操作控件@Overridepublic 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 blocke.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处理各种通知、请求事件的

// 修改行为 不要打开系统浏览器,而是把内容显示在当WebViewresultWebView.setWebViewClient(new WebViewClient() {// 条件:开始载入网页@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);dialog = new ProgressDialog(WebViewActivity1.this);dialog.setTitle("传智浏览器 提示");dialog.setMessage("正在拼命加载中...");// 开始dialog.show();}// 条件:结束载入网页@Overridepublic 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() {// 回调函数:条件:只要进度发生改 就调用@Overridepublic 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>() {// 任务开始前@Overrideprotected void onPreExecute() {super.onPreExecute();...显示 }// 任务执行中.@Overrideprotected 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;}// 任务完成@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);if (isRunning) {mProgressBar.setVisibility(View.INVISIBLE);status.setText("备份完成 本次备份" + number + "条");} else {status.setText("备份被取消");}} // 回调函数 进度变化时被调用 条件:publisProgress();@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);mProgressBar.setProgress(values[0]);status.setText("当前备份第" + values[0] + "/" + number + "条");} }.execute();

0 0
原创粉丝点击