前面了解了下服务端和客户端的相关知识 ,那么他们是通过什么来进行进行连接的呢?
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 }
效果图
网络或其他错误时: