• 安卓学习Day12


    HttpURLConnection

    向服务器发送get请求和接受请求



    记得加 android.permission.INTERNET

    主线程不能进行一些耗时操作,不然弹出应用无响应的对话框。且谷歌也强制要求 连接网络不能放到主线程

    只有主线程才可以更新UI。子线程做一些逻辑计算,耗时请求就行,就不要在子线程里立刻XX.setText("aa");

    handler原理(单词可以理解为助手的意思)

    1.在主线程new 一个Handler

    handler的作用是用来发送消息的和处理消息的。
    Looper的作用是去消息队列里面取消息。
    handler先发消息到消息队列,消息队列里面有个Looper(消息循环器),Looper不停地监听消息队列,把这个消息队里里的消息取出来,交给handler处理。

    项目部署完,主线程一创建,Looper就自动有了

    Android里任何地方 ,任何方法里面都是属于主线程,这是安卓帮我们设置好的。只要不做new Thread()这样的事,全部都是主线程.

    =========
    Toast不能再子线程弹出来,因为Toast是一个View,凡是设置UI更新 都不能在子线程写更新UI的逻辑

    ctrl +shift +X Y 变成大小写

    经验总结:

    **不管你什么版本的手机 只要做耗时的操作(比如连接网络 比如拷贝大的数据 等等) 就自己开一个子线程,获取数据后想要更新UI 就使用Handler就可以了 **

    接受网站相应的图片,并显示出来

    BitmapFactory

    一直new Message()效率 比较低 。所以用Message mes = Message.obatin() //使用msg的静态方法 可以减少对象的创建

    只要执行了handler.sendMessage(msg),它就会立刻调用对象的handleMessage(Message msg)方法:

    对网上接受的图片进行缓存


    =================================================

    以上的更新UI是否觉得繁琐,下面谷歌给我们封装了一个API-----------runOnUiThread(Runnable action)


    这句API 不管你在什么位置上调用 action都运行在UI线程里

    常见消息API (API:应用程序编程接口)

    类似定时器:```Timer timer = new Timer() ; TimerTask task = new TimerTask(public void run(){} ); timer.schedule(task,3000);
    //timer.schedule(task,X秒后,间隔X秒执 行一次);
    //timer.cancel();

    上面这个java传统方法 Timer不能用于UI更新操作。 只能用下面谷歌提供封装好的方法
    ![](https://images2018.cnblogs.com/blog/1175089/201804/1175089-20180401160546134-156099053.png)
    
    ##小新闻客户端练习
    数据来源:百度 腾讯RSS聚合
    

    1、Setting->Editor->【Live Templates】->点击+,选择【Template Group】创建一个自定义模板组
    2、选中刚刚创建的group,点击+,选择【Live Template】创建一个自定义模板
    Abbreviation:表示这个模板的快捷方式,你敲这些【字符+回车】后,模板就自动输出了
    Description:表示这个模板描述
    Template text:模板的内容
    3、点击下面蓝色的字"change",设置你这个快捷键在哪里生效,一般把java或XML勾上就行了

    
    ###XML---XmlSerializer
    Xml.newSerializer(); ---> 使生成XML格式文件
    
    //使用XmlSerializer来序列化xml文件
    public static boolean backupSms_android(Context context){
    	
    	try{
    		
    		//0.获取短信数据
    		ArrayList<SmsBean> allSms = SmsDao.getAllSms();
    		//1.通过Xml获取一个XmlSerializer对象
    		XmlSerializer xs = Xml.newSerializer();
    		//2.设置XmlSerializer的一些参数,比如:设置xml写入到哪个文件中
    		//os:xml文件写入流   encoding:流的编码
    		xs.setOutput(context.openFileOutput("backupsms2.xml", Context.MODE_PRIVATE), "utf-8");
    		//3.序列化一个xml的声明头
    		//encoding:xml文件的编码  standalone:是否独立
    		xs.startDocument("utf-8", true);
    		//4.序列化一个根节点的开始节点
    		//namespace:命名空间  name: 标签的名称
    		xs.startTag(null, "Smss");
    		//5.循环遍历list集合序列化一条条短信
    		
    			for (SmsBean smsBean : allSms) {
    				xs.startTag(null, "Sms");
    				//name:属性的名称  value:属性值
    				xs.attribute(null, "id", smsBean.id+"");
    				
    				xs.startTag(null, "num");
    				//写一个标签的内容
    				xs.text(smsBean.num);
    				xs.endTag(null, "num");
    				
    				
    				xs.startTag(null, "msg");
    				xs.text(smsBean.msg);
    				xs.endTag(null, "msg");
    				
    				
    				xs.startTag(null, "date");
    				xs.text(smsBean.date);
    				xs.endTag(null, "date");
    				
    				xs.endTag(null, "Sms");
    			}
    
    		//6.序列化一个根节点的结束节点
    			xs.endTag(null, "Smss");
    		//7.将xml写入到文件中,完成xml的序列化
    			xs.endDocument();
    			return true;
    
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
    	return false;
    }
    
    
    ###使用pull解析xml格式的数据----XmlPullParser
    ![](https://images2018.cnblogs.com/blog/1175089/201804/1175089-20180401200015188-2047984923.png)
    
    

    //解析xml文件读取短信内容
    public static int restoreSms(Context context) {
    ArrayList arrayList = null;
    SmsBean smsBean = null;
    try{
    //1.通过Xml获取一个XmlPullParser对象
    XmlPullParser xpp = Xml.newPullParser();
    //2.设置XmlPullParser对象的参数,需要解析的是哪个xml文件,设置一个文件读取流

    		//通过context获取一个资产管理者对象
    		AssetManager assets = context.getAssets();
    		//通过资产管理者对象能获取一个文件读取流
    		InputStream inputStream = assets.open("backupsms.xml");
    		xpp.setInput(inputStream,"utf-8");
    		//xpp.setInput(context.openFileInput("backupsms2.xml"), "utf-8");
    		//3.获取当前xml行的事件类型
    		int type = xpp.getEventType();
    		//4.判断事件类型是否是文档结束的事件类型
    		while(type != XmlPullParser.END_DOCUMENT){
    			//5.如果不是,循环遍历解析每一行的数据。解析一行后,获取下一行的事件类型
    
    			String currentTagName = xpp.getName();
    			//判断当前行的事件类型是开始标签还是结束标签
    			switch (type) {
    			case XmlPullParser.START_TAG:
    				if(currentTagName.equals("Smss")){
    					//如果当前标签是Smss,需要初始化一个集合
    					arrayList = new ArrayList<SmsBean>();
    				}else if(currentTagName.equals("Sms")){
    
    					smsBean = new SmsBean();
    					smsBean.id = Integer.valueOf(xpp.getAttributeValue(null, "id"));   // 命名空间:null   name :"id"     既这种情况<sms id="1">XX</sms>
    
    				}else if(currentTagName.equals("num")){
    					smsBean.num =  xpp.nextText();
    				}else if(currentTagName.equals("msg")){
    					smsBean.msg =  xpp.nextText();
    				}else if(currentTagName.equals("date")){
    					smsBean.date =  xpp.nextText();
    				}
    				break;
    			case XmlPullParser.END_TAG:
    				//当前结束标签是Sms的话,一条短信数据封装完成, 可以加入list中
    				if(currentTagName.equals("Sms")){
    					arrayList.add(smsBean);
    				}
    				break;
    			default:
    				break;
    			}
    
    			type = xpp.next();//获取下一行的事件类型    //既指针指向下一行
    		}
    
    		return arrayList.size();
    
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
    	return 0;
    }
    
    笔记:XmlPullParser.END_DOCUMENT 的意思是判断当前标签是否已经到底了,既XML 中最后一个标签
    思想:![](https://images2018.cnblogs.com/blog/1175089/201804/1175089-20180401203650494-2101027430.png)
    ![](https://images2018.cnblogs.com/blog/1175089/201804/1175089-20180401204525959-623915905.png)
    ![](https://images2018.cnblogs.com/blog/1175089/201804/1175089-20180401205027635-634030398.png)
    
    **笔记:** 
    

    android:layout_alignParentBottom="true" //在父窗体的底部
    android:layout_toRightOf="@id/iv_icon" //在指定控件的右边
    android:layout_below="@id/iv_icon" //在指定控件的下面
    android:layout_alignLeft="@id/iv_icon" //与指定控件的左边对齐

  • 相关阅读:
    敏捷社区--干货下载 | 10月携程敏捷总动员沙龙
    敏捷开发--洞察敏捷模型,从PO的角度看敏捷产品管理
    携程PMO--小罗说敏捷之WIP限制在制品
    Jmeter分布式压测配置
    Django安装
    Git安装与配置,以及pycharm提交代码到github
    SVN状态图标不显示的解决办法
    PyCharm专业版激活+破解到期时间2100年
    部署python项目到linux服务器
    python+selenium自动化测试,浏览器最大化报错解决方法
  • 原文地址:https://www.cnblogs.com/czy16/p/8684789.html
Copyright © 2020-2023  润新知