安卓基础干货(四):安卓网络编程的学习

网络HTML查看器 httpurlconnection: 1、发送请求 (1)创建一个URL对象 (2)设置请求头信息 2、服务器返回数据 (1)判断状态码:200 ok,404 没有找到资源、503、509 服务器端错误 (2)解析服务器返回的二进制数据,解析成一个图片 (3)把图片显示在TextView上

示例代码:

package com.itheima.htmlview; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.itheima.htmlview.utils.StreamTools; public class MainActivity extends Activity { private EditText et_path; private TextView tv_content; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { String data = (String) msg.obj; tv_content.setText(data); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_path = (EditText) findViewById(R.id.et_path); tv_content = (TextView) findViewById(R.id.tv_content); } public void click(View view){ new Thread(){ public void run() { try { String path = et_path.getText().toString().trim(); // 1、发送请求 // (1)创建一个URL对象 URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // (2)设置请求头信息 conn.setRequestMethod("GET"); conn.setConnectTimeout(3000); // 2、服务器返回数据 // (1)判断状态码:200 ok,404 没有找到资源、503、509 服务器端错误 int code = conn.getResponseCode(); if(code == 200){ // (2)解析服务器返回的二进制数据,解析成一个字符串 InputStream is = conn.getInputStream(); String data = StreamTools.readStream(is); // (3)把图片显示在TextView上 Message msg = Message.obtain(); msg.obj = data; handler.sendMessage(msg); }else{ Toast.makeText(MainActivity.this, "请输入一个HTML页面的网络地址", 0).show(); } } catch (Exception e) { e.printStackTrace(); } }; }.start(); } } 线程不能修改UI界面 activity中的oncreate方法和单击事件的方法都是运行在主线程中的。 只有创建UI界面的那个线程才能修改UI: Only the original thread that created a view hierarchy can touch its views. 主线程(UI线程),只有主线程才能修改UI。如果子线程修改UI,系统验证当前线程是不是主线程,如果不是主线程,就会终止运行。 runOnUiThread 消息处理机制的原理(重点) 步骤: 1、主线程中创建handler private Handler handler = new Handler(){ }; 2、在线程中得到handler的引用,调用发送消息的方法, Message msg = new Message(); msg.obj = bm; handler.sendMessage(msg); 3、handler修改UI界面 //用来接收消息并处理消息 @Override public void handleMessage(Message msg) { super.handleMessage(msg); //2、handler修改UI界面 Bitmap bm = (Bitmap) msg.obj; iv.setImageBitmap(bm); }

Handler、Message、Looper(消息处理机制的原理):

前提知识: 所有使用UI界面的操作系统,后台都运行着一个死循环,在不停的监听和接收用户发出的指令,一旦接收指令就立即执行。 当我们的Android应用程序的进程一创建的时候,系统就给这个进程提供了一个Looper,Looper是一个死循环,它内部维护这个一个消息队列,Loop不停地从消息队列中取消息(Message),取到消息就发送给了Handler,最后Handler根据接收到的消息去修改UI。 网图片查看器(重点)

1、发送请求:GET

2、接收服务器端返回的响应数据

使用代码实现的步骤:

1、创建URL,打开一个HTTP的连接; 2、设置请求头信息:GET(GET、POST) 3、接收服务器端返回的响应数据,响应码:200 ok,404没有找到资源 ,503服务器端内部错误 4、把接收的二进制数据转换成图片

模版代码:

1、创建一个URL对象,打开一个HTTP连接 URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 2、设置请求头信息:GET(GET、POST) conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); 3、接收服务器端返回的响应数据,响应码:200 ok,404没有找到资源 ,503服务器端内部错误 int code = conn.getResponseCode(); if(code == 200){ InputStream is = conn.getInputStream(); } 4、添加访问互联网的权限: <uses-permission android:name="android.permission.INTERNET"/> 网络在主线程上的异常: android.os.NetworkOnMainThreadException 从Androi4.0开始,google更加UI界面运行的流畅性,强制要求访问网络的操作不能在主线程中进行,只能在子线程中进行。 消息处理常用API //运行在主线程上,内部使用线程的合并技术,把数据子线程合并了主线程 runOnUiThread(new Runnable() { @Override public void run() { iv.setImageBitmap(bm); } }); //Runnable 线程的接口类,uptimeMillis从开机到现在间隔的毫秒数 handler.postAtTime(new Runnable() { @Override public void run() { tv.setText("postAtTime"); } }, 5000); Timer计时器 新闻客户端

1、设计UI界面

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjdds.html