1、网页源码查看器
[1] HttpURLConnection 接收和发送数据
// [1] 获取输入的内容
String path = et_path.getText().toString().trim();
//[2] 获取URL实例
URL url = new URL(path);
// [3] 获取HttpURLConnection实例
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// [4] 设置访问方法
conn.setRequestMethod("GET");
// [5] 设置访问超时时间
conn.setReadTimeout(5000);
// [6] 获取访问状态码
int code = conn.getResponseCode();
//[7] 如果code == 200 说明正确获取了页面
if(code == 200){
//[8] 获取输入流
InputStream inputStream = conn.getInputStream();
String value = StreamUtils.readStream(inputStream);
tv_content.setText(value);
[2] ScrollView 滚动空间,只可以存在一个子控件,可以进行控件嵌套
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv_content1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</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()的方式拿到,就像下面这个可以直接将流转换成位图
InputStream inputStream = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
[3] 对于多次访问同一图片,为了节约用户流量,并加快访问速度,可以使用缓存,谷歌给提供了一套一个文件夹,来专门用于缓存,叫做cache,获取cache文件夹方法getCacheDir(),这个文件夹下不要放重要数据,因为这些数据是用户可以随手删掉的,并且不会有任何的提示。
5、runOnUiThread写法
[1] 这行代码可以出现在任何线程中,如果出现在UI线程(主线程)中,那么会直接执行,如果出现在其他的子线程中会将消息发送到事件队列中,等待被取出
[2] 用法
//使用runOnUIThread()来直接更新线程
runOnUiThread(new Runnable() {
@Override
public void run() {
//可以直接进行UI更新
tv_content.setText(value);
}
});
[3] runOnUiThread用在仅仅想更新UI的情况下可以使用,但是不要忘记Handler因为这个类可以进行在线程之间通过Message传递信息
6、常见消息api
// [1] handler 的另外一个延迟执行
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.d("handler","executed");
}
},2000); //延迟2s后执行
//[2] 使用Timer来延迟执行,然后重复执行
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
Log.d("Timer","executed");
}
};
timer.schedule(task,1000,1000); //在1s后执行,然后每隔1s再执行一次
7、新闻客户端
8、开源项目smartimageview介绍
9、smartimageview原理介绍