android——HttpUrlConnection

前面了解了下服务端和客户端的相关知识 ,那么他们是通过什么来进行进行连接的呢?

  Android可以用HttpURLConnection或HttpClient接口来开发http程序。在Android 上发送HTTP 请求的方式一般有两种,HttpURLConnection 和HttpClient本节将带来HttpUrlConnection的相关用法。

  案例:从网络获取一张图片并显示(用异步任务实现)

  但我们点击button的时候后台为我们获取网络图片并更新UI,如果成功会有个显示123的textview,否则则显示如下代码中的错误信息(下面紧 展示后台代码)

  1 package com.example.multithreadind01;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.DataOutputStream;
  5 import java.io.File;
  6 import java.io.FileOutputStream;
  7 import java.io.InputStream;
  8 import java.io.InputStreamReader;
  9 import java.io.OutputStream;
 10 import java.net.HttpURLConnection;
 11 import java.net.MalformedURLException;
 12 import java.net.URL;
 13 import java.net.URLConnection;
 14 import java.net.URLEncoder;
 15 import java.util.List;
 16 
 17 import android.graphics.Bitmap;
 18 import android.graphics.BitmapFactory;
 19 import android.os.AsyncTask;
 20 import android.os.Environment;
 21 import android.view.View;
 22 import android.widget.BaseAdapter;
 23 import android.widget.ImageView;
 24 import android.widget.ProgressBar;
 25 import android.widget.TextView;
 26 import android.widget.Toast;
 27 
 28 public class MyTask extends AsyncTask {
 29 
 30     
 31     private Bitmap b;
 32     private MainActivity activity;
 33     public MyTask(MainActivity activity){
 34         this.activity = activity;
 35     }
 36     private String errorMessage = "";
 37     private String messageInfo = "";
 38     private static final String URL_IMG = "http://img.firefoxchina.cn/2016/12/8/201612080831150.jpg";
 39     private static final String URL_STR = "http://android2017.duapp.com/test1.jsp";
 40     
 41     
 42     //1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务)
 43     //2.绝对不能碰UI
 44     @Override
 45     protected Object doInBackground(Object... params) {
 46         try {
 47             
 48             URL url = new URL(URL_IMG);
 49             
 50             HttpURLConnection conn = (HttpURLConnection)url.openConnection();
 51             //设置超时
 52             conn.setConnectTimeout(6*1000);
 53             //对连接进行配置  设置输入输出流
 54             
 55             conn.setDoOutput(false);
 56             conn.setDoInput(true);
 57             
 58             设置请求方式
 59             conn.setRequestMethod("GET");
 60             //防止读取脏数据  
 61             conn.setUseCaches(false);
 62             
 63             if ( conn.getResponseCode() == 200){
 64                 //输入流
 65                 InputStream is = conn.getInputStream();
 66                 b =  BitmapFactory.decodeStream(is);
 67                 
 68                 // 保存图片相关
 69                 
 70                 FileOutputStream outStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/"+"test.jpg"));
 71                 byte[] buffer = new byte[1024];
 72                 int len = -1;
 73                 while( (len = is.read(buffer)) != -1 ){
 74                     outStream.write(buffer, 0, len);
 75                     
 76                     
 77                 }
 78                 //b.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 
 79                 
 80                 
 81                 outStream.close();
 82                 is.close();
 83                 
 84                 
 85                 return "123";
 86             }
 87             else{
 88                 errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")";
 89                 return "errorserver";
 90             }
 91             
 92         } catch (Exception e) {
 93             errorMessage = e.getMessage();
 94             return "errorclient";
 95         }
 96     }
 97     
 98     //准备
 99     @Override
100     protected void onPreExecute() {
101         Toast.makeText(activity, "开始执行...", Toast.LENGTH_SHORT).show();
102         
103     }
104     
105     //做完后执行
106     @Override
107     protected void onPostExecute(Object result) {
108         String r = result.toString();
109         TextView tv = (TextView)activity.findViewById(R.id.textView1);
110         if ("errorclient".equals(r)){
111             if (errorMessage.indexOf("No add")!=-1){
112                 tv.setText("网络不通");
113             }
114             else{
115                 tv.setText("访问网络时其它异常:"+errorMessage);
116             }
117             
118         }else if("errorserver".equals(r)){
119             tv.setText(errorMessage);
120         }else{
121             tv.setText(r);
122             ImageView iv = (ImageView) activity.findViewById(R.id.img1);
123             iv.setImageBitmap(b);
124         }    
125         
126     }
127     
128     //分步完成
129     @Override
130     protected void onProgressUpdate(Object... values) {
131         adapter.notifyDataSetChanged();
132     }
133 
134 }

效果图

  

网络或其他错误时:

  

  

原文地址:https://www.cnblogs.com/mark0812/p/6164888.html