HttpURLConnection获取数据
使用步骤:
1.创建Url
2.用Url打开连接
3.设置请求参数
4. 获取响应状态码
2xxx 请求成功 3xxx重定向 4xxx资源错误 5xxx服务器错误
5.获取服务器返回的二进制输入流
6.添加网络权限
<uses-permission
android:name="android.permission.INTERNET"/>
示例代码:
import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { private EditText etPath; private ImageView iv; private String path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etPath = (EditText) findViewById(R.id.et_path); // 在主线程中创建 iv = (ImageView) findViewById(R.id.iv); } // 1. 在主线程中创建Hanlder对象 Handler mHandler = new Handler() { public void handleMessage(Message msg) { // 把图片显示在imageview上 iv.setImageBitmap((Bitmap)msg.obj); }; }; // 3. 在handleMessage()中修改UI /** * 1. 获取服务器返回的二进制输入流 * 2. 把流转成位图对象 * 3. 把图片显示在imageview上 */ public void look(View v) { System.out.println("点击按钮的线程:" + Thread.currentThread().getName()); path = etPath.getText().toString().trim(); if (TextUtils.isEmpty(path) || !path.startsWith("http")) { Toast.makeText(this, "请输入正确的网址", 0).show(); return; } // 开启线程 new Thread() { public void run() { requestNetWork(); }; }.start(); } /** * 网络通讯 */ protected void requestNetWork() { try { // 1. 写一个Url URL url = new URL(path); // 2. 用这个Url打开http连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 3. 设置请求参数 // 不设置,默认就是get请求 conn.setRequestMethod("GET"); conn.setConnectTimeout(3000); // 4. 获取状态吗 // * 2xxx响应成功 3xxx重定向 4xxx资源错误 5xxx服务器错误 int code = conn.getResponseCode(); if (code == 200) { // 5. 获取服务返回的二进制输入流 InputStream is = conn.getInputStream(); // 把流转成位图对象 Bitmap bmp = BitmapFactory.decodeStream(is); // 2. 在子线程中用handler发消息 Message msg = new Message(); msg.obj = bmp; mHandler.sendMessage(msg); } else { // Toast.makeText(this, "code:"+code, 0).show(); } } catch (Exception e) { e.printStackTrace(); // Toast.makeText(this, "服务器忙", 0).show(); } } }
查看网络文字示例代码 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private static final int MSG_SUCC = 0; private static final int MSG_ERR = 1; private static final int MSG_ERR_CODE = 2; private EditText etPath; private TextView tvContent; private String path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etPath = (EditText) findViewById(R.id.et_path); tvContent = (TextView) findViewById(R.id.tv); } /** * 1. 获取用户输入的网址,做非空判断 * 2. 在子线程中进行网络通讯 * 3. 获取服务器返回的二进制数据流 * 4. 把流转成文字 * 5. 用Handler显示文字 */ public void look(View v) { // 获取用户输入的网址,做非空判断 path = etPath.getText().toString().trim(); if (TextUtils.isEmpty(path) || !path.startsWith("http")) { Toast.makeText(this, "亲,请输入正确的网址,例如http开头", 0).show(); return; } // 在子线程中进行网络通讯 new Thread() { public void run() { requestNetWork(); }; }.start(); } /** * 获取服务器返回的二进制数据流 */ protected void requestNetWork() { try { // 1. 写一个Url URL url = new URL(path); // 2. 用这个Url打开http连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 3. 设置请求参数 conn.setRequestMethod("GET"); conn.setConnectTimeout(3000); // 4. 获取状态吗 // * 2xxx响应成功 3xxx重定向 4xxx资源错误 5xxx服务器错误 int code = conn.getResponseCode(); if (code == 200) { // 5. 获取服务返回的二进制输入流 InputStream is = conn.getInputStream(); // 把流转成文字 String text = StringUtils.parseStream2Str(is); // 用Handler显示文字 Message msg = Message.obtain();// 从消息池中获取消息 msg.obj = text; msg.what = MSG_SUCC; mHandler.sendMessage(msg); } else { Message msg = Message.obtain();// 从消息池中获取消息 msg.obj = code; msg.what =MSG_ERR_CODE; mHandler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); mHandler.sendEmptyMessage(MSG_ERR); } } Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_SUCC: tvContent.setText((String) msg.obj); break; case MSG_ERR_CODE: Toast.makeText(MainActivity.this, "code:"+msg.obj, 0).show(); break; case MSG_ERR: Toast.makeText(MainActivity.this, "服务器忙", 0).show(); break; default: break; } }; }; }
import java.io.ByteArrayOutputStream; import java.io.InputStream; /** * 操作字符 */ public class StringUtils { /** * 从流中转成字符串 * * @param is * 输入流 * @return null表示失败 */ public static String parseStream2Str(InputStream is) { //内存输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = -1; byte[] buffer = new byte[1024*8]; try { while((len = is.read(buffer)) != -1){ baos.write(buffer, 0, len); } return new String(baos.toByteArray()); } catch (Exception e) { e.printStackTrace(); return null; } } }
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!
posted on 2017-02-23 10:23 LoaderMan 阅读(1195) 评论(0) 编辑 收藏 举报