第三天

1、网页源码查看器
        [1]  HttpURLConnection  接收和发送数据
  
  
  1. // [1] 获取输入的内容
  2. String path = et_path.getText().toString().trim();
  3. //[2] 获取URL实例
  4. URL url = new URL(path);
  5. // [3] 获取HttpURLConnection实例
  6. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  7. // [4] 设置访问方法
  8. conn.setRequestMethod("GET");
  9. // [5] 设置访问超时时间
  10. conn.setReadTimeout(5000);
  11. // [6] 获取访问状态码
  12. int code = conn.getResponseCode();
  13. //[7] 如果code == 200 说明正确获取了页面
  14. if(code == 200){
  15. //[8] 获取输入流
  16. InputStream inputStream = conn.getInputStream();
  17. String value = StreamUtils.readStream(inputStream);
  18. tv_content.setText(value);

        [2] ScrollView    滚动空间,只可以存在一个子控件,可以进行控件嵌套
   
   
  1. <ScrollView
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <LinearLayout
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical">
  8. <TextView
  9. android:id="@+id/tv_content"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent" />
  12. <TextView
  13. android:id="@+id/tv_content1"
  14. android:layout_width="match_parent"
  15. android:layout_height="match_parent" />
  16. </LinearLayout>
  17. </ScrollView>

2、消息机制的写法
    [1] anr (android not response )  线程无响应, 主线程(UI线程)  
    [2] 原因:在主线程中进行了耗时的操作,例如联网,加载大数据,等处理,就会出现ANR异常
    [3] 处理办法 : 为了避免出现ANR现象,就要放在子线程中,自己开启一个线程
    [4] 在android 4.0之后,谷歌强制将联网的操作放在子线程中处理
       Caused by: android.os.NetworkOnMainThreadException
    [5] 只有在主线程中才能更新UI
3、handler使用方法
    [1]在主线程中new一个handler, 重写handleMessage方法
    [2]在子线程中,拿着主线程中的handler调用handler.sendMessage(msg)方法
    [3]在主线程中拿到msg就可以更新UI啦
    [4]  自我问题:注意,在开启子线程的时候这么写 new Thread(){}.start();,然后再去实现方法,不然start()方法很容易忘

3、handler原理
       handler通信原理
       [1] 首先由handler的sendMessage()方法,发送一条message,
       [2]然后,进入到主线程的消息队列(MessageQueue)中,然后存在一个Looper实例,开始取出MessageQueue中的消息,
       [3]调用Looper.target.dispatchMessage(),传递给handler的handleMessage,其中target属性就是一个Handler对象
       [4]然后我们就可以重写 handleMessage()方法,来更新UI啦
 
3.1 handler属性what
        what是用来标识信息类型的,例如在更新UI的时候,可能获取内容失败,不能发一条message,就必须进行标识,就是用到了what属性
3.2 Toast属于view,所以也无法在子线程进行展示
4、图片查看器
    [1] Message 可以通过obtain()方法获取,这个方法是,如果消息池中存在可用对象,那么就直接返回使用,如果没有,创建一个返回,这样效率更高
    [2] 在android中,用到 的图片都是位图,而不是矢量图,拿到位图,可以通过BitmapFactory类的静态方法decodeXXX()的方式拿到,就像下面这个可以直接将流转换成位图
    
  
  
  1. InputStream inputStream = connection.getInputStream();
  2. Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    [3] 对于多次访问同一图片,为了节约用户流量,并加快访问速度,可以使用缓存,谷歌给提供了一套一个文件夹,来专门用于缓存,叫做cache,获取cache文件夹方法getCacheDir(),这个文件夹下不要放重要数据,因为这些数据是用户可以随手删掉的,并且不会有任何的提示。
5、runOnUiThread写法
    [1]  这行代码可以出现在任何线程中,如果出现在UI线程(主线程)中,那么会直接执行,如果出现在其他的子线程中会将消息发送到事件队列中,等待被取出
    [2] 用法
   
   
  1. //使用runOnUIThread()来直接更新线程
  2. runOnUiThread(new Runnable() {
  3. @Override
  4. public void run() {
  5.                                //可以直接进行UI更新
  6. tv_content.setText(value);
  7. }
  8. });
    [3]   runOnUiThread用在仅仅想更新UI的情况下可以使用,但是不要忘记Handler因为这个类可以进行在线程之间通过Message传递信息
6、常见消息api
   
   
  1. // [1] handler 的另外一个延迟执行
  2. new Handler().postDelayed(new Runnable() {
  3. @Override
  4. public void run() {
  5. Log.d("handler","executed");
  6. }
  7. },2000); //延迟2s后执行
  8. //[2] 使用Timer来延迟执行,然后重复执行
  9. timer = new Timer();
  10. task = new TimerTask() {
  11. @Override
  12. public void run() {
  13. Log.d("Timer","executed");
  14. }
  15. };
  16. timer.schedule(task,1000,1000); //在1s后执行,然后每隔1s再执行一次

7、新闻客户端
8、开源项目smartimageview介绍
9、smartimageview原理介绍
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值