day04

1网页源码查看器
    httpurlconnection类:用于发送或接收数据

    ScrollView  只能有一个亲孩子(但可以有很多孙子辈)
  1. package com.phone.weblook;
  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.os.StrictMode;
  8. import android.view.View;
  9. import android.widget.EditText;
  10. import android.widget.TextView;
  11. public class MainActivity extends Activity {
  12. private EditText et_path;
  13. private TextView tv_result;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. et_path = (EditText) findViewById(R.id.et_path);
  19. tv_result = (TextView) findViewById(R.id.tv_result);
  20. }
  21. //[2]点击按钮进行查看 指定路径的源码
  22. public void click(View v)
  23. {
  24. try {
  25. //[2.1]获取源码路径
  26. String path = et_path.getText().toString().trim();
  27. //[2.2]创建URL 对象指定我们要访问的网址(路径)
  28. URL url = new URL(path);
  29. //[2.3]拿到httpurlconnection对象 用于发送或者接受数据
  30. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  31. //[2.4]设置发送get请求
  32. //get要求大写,默认为get请求
  33. conn.setRequestMethod("GET");
  34. //[2.5]设置请求超时时间
  35. conn.setConnectTimeout(5000);
  36. //[2.6]获取服务器返回的状态码
  37. int code = conn.getResponseCode();
  38. //[2.7]如果code == 200 说明请求成功
  39. if(code == 200)
  40. {
  41. //[2.8]获取服务器返回的数据 是以流的形式返回的
  42. // 由于把流转换成字符串是一个非常常见的操作 所以抽出一个工具类
  43. InputStream in = conn.getInputStream();
  44. //[2.9]使用我们定义的工具类把in转换成String
  45. String content = StreamTools.readStream(in);
  46. //[2.9]把流里面的数据展示到textview上
  47. tv_result.setText(content);
  48. }
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.phone.weblook.MainActivity" >
  7. <EditText
  8. android:id="@+id/et_path"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:hint="请输入查看网址" />
  12. <Button
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:onClick="click"
  16. android:text="查看" />
  17. <ScrollView
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content" >
  20. <TextView
  21. android:id="@+id/tv_result"
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent" />
  24. </ScrollView>
  25. </LinearLayout>

2消息机制的写法(***)
    [1]ANR    Application not response 应用无响应  主线程(UI线程)
    [2]如果在主线程中进行了耗时的操作(比如连接网络 拷贝大的数据)
    [3]避免ANR 可以把耗时的操作 放到子线程中  自己再创建一个线程
    [4]在4.0之后谷歌强制要求连接网络不能再主线程进行访问
       09-11 10:32:32.932: W/System.err(10733): android.os.NetworkOnMainThreadException
    [5]只有主线程(UI线程)才可以更新UI
    [6]消息机制

3handler原理(子线程传送数据给主线程)
    handler使用步骤
    [1]在主线程定义一个Handler
  1. private Handler handler = new Handler()
  2. {
  3. };
    [2]使用handler会重写handler里面的handleMessage方法
  1. private Handler handler = new Handler()
  2. {
  3. public void handleMessage(android.os.Message msg)
  4. {

  5. };
  6. };
    [3]拿着我们在主线程创建的handler去子线程发消息
    
  1. //[2.9.0]创建message对象
  2. Message msg = new Message();
  3. //发一条消息 消息里把数据放到了msg里handleMessage方法就会执行
  4. msg.obj = content;
  5. //[2.9.1]拿着我们创建的hangler(助手)告诉系统 说我要更新UI
  6. handler.sendMessage(msg);
    [4]handleMessage方法就会执行  在这个方法里去更新UI
  1. private Handler handler = new Handler()
  2. {
  3. public void handleMessage(android.os.Message msg)
  4. {
  5. //所以就可以在主线程里面更新Ui了
  6. String content = (String) msg.obj;
  7. tv_result.setText(content);
  8. };
  9. };

    handler的作用是用来发消息和处理消息的
    Looper的作用是去消息队列里面取消息
    Looper是在主线一创建Looper就有了
 

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

4图片查看器
    [1]把流信息转换成bitmap对象
    [2]bitmapFactory。decodeStream(inputStream in)
    [3]最后要加上网络访问权限


5runOnUiThread写法
    [1]如果仅仅就是更新UI 那么就用runOnUIThread这个API就可以
    [2]有的时候可以通过Handler发送消息  携带数据  这时候必须的用handler

6常见消息Api
    handler
postDelayed方法延迟运行run函数
  1. new Handler().postDelayed(new Runnable() {
  2. @Override
  3. public void run() {
  4. Toast.makeText(getApplicationContext(), "ououououou", 0).show();
  5. }
  6. }, 5000);
    定时器Timer
  1. timer = new Timer();
  2. task = new TimerTask() {
  3. @Override
  4. public void run() {
  5. runOnUiThread(new Runnable() {
  6. @Override
  7. public void run() {
  8. Toast.makeText(getApplicationContext(), "ououououou", Toast.LENGTH_LONG).show();
  9. }
  10. });
  11. // System.out.println("asdfsdf");
  12. }
  13. };
  14. //5秒后执行
  15. // timer.schedule(task, 5000);
  16. //3秒后每隔一秒执行
  17. timer.schedule(task, 3000, 1000);


7新闻客户端
   [1]UI效果是公司里面美工去画的
   [2]应用的传输数据 定义接口
   [3]关于xml的数据 是服务器开发人员通过一定的技术手段返回的 对应Android开发人员          我们要会解析就OK,把我们关心的数据取出来  展示到Android中控件上


8开源项目smartimageview介绍
    [1]把com包 源码包拷贝到当前工程
    [2]在使用SmartImageView类的时候 在布局里面定义的时候  一定是这个类的完整包名 + 类名

smartimageview原理介绍

10今日总结
    [1]网页源码查看器(掌握)
        httpurlconnection
        服务器是以流的形式把数据返回    

    [2]消息机制(掌握)
        handler    当我想在子线程更新UI的时候需要使用到handler
    
    [3]图片查看器
         bitmapFactory  里面的方法都是静态方法 可以把一个流转换成bitmap
   
    [4]runOnUiThread()必须会

    [5]新闻客户端(包含前三天大多数知识点)
          listview   开子线程去取数据   handler    xml解析  baseAdapter

   [6]smartImageView(掌握)
   [7]自定义smartimageview(了解)   





只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
原文地址:https://www.cnblogs.com/phonecom/p/7bac4f036f10bcb01af7aab6f84ac500.html