• android中httpClient的运用


    1、httpClient简介

    http超文本协议,主要用于在浏览器和服务器间传输html数据。但是在android中也常常被用来交换小数据

    httpClient是apache封装的,专门用来处理http请求

    2、例子

    下面展示的是客户端访问服务器,解析JSON获取一张图片地址,然后根据这个图片地址去下载一张图片并展示

    服务器上放的是一个js,里面的内容是一段json数据,如下:

    {
    "status":"0",
    "data":
       {
        "img_url":"http://xxxx.png",
        "download_url":"http://xxxx"
       }
    }

    里面这个img_url就是我们要获取的图片地址

    利用http来向服务器请求获取这段json:

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONObject;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    
    public class ImageUrlGetter {
      
    private static final String LOADING_URL = "http://xxx.js";//访问的就是这个js文件,内容见上 private ImageUrlCallback mCallback; private Context mContext; public interface ImageUrlCallback { public void onGetImgaeDone(Bitmap bm); } public ImageUrlGetter() { } /** * 先拉取imgUrl,然后再根据imgUrl拉取bitmap * * @param callback */ public void getImg(ImageUrlCallback callback) { mCallback = callback; try { HttpEntity entity = getData(LOADING_URL); String entityStr = EntityUtils.toString(entity);//获取json
           
    if (parseJson(new JSONObject(entityStr)) != 0) {//解析json callBack(null); } } catch (Exception e) { callBack(null); } } /** * 请求url,返回httpEntity * * @param url * @return * @throws Exception */ private HttpEntity getData(String url) throws Exception { // HttpClient是个interface HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(new URI(url)); HttpResponse responce = client.execute(get); int status = responce.getStatusLine().getStatusCode(); switch (status) { case HttpStatus.SC_OK://200 case HttpStatus.SC_NOT_MODIFIED://304 return responce.getEntity(); } return null; } /** * 根据远程url去下载图片 * * @param imgUrl * @throws Exception */ private void loadRemoteImage(String imgUrl) throws Exception { if (imgUrl != null) { HttpEntity entity = getData(imgUrl); String sdPath = getSDCardPath(); String imgPath = null; if (sdPath != null) { imgPath = sdPath + "/testImage.png";
              //将图片写到本地并回调 FileOutputStream fos
    = new FileOutputStream(imgPath); fos.write(EntityUtils.toByteArray(entity)); fos.close();
             callBack(BitmapFactory.decodeFile(imgPath)); } } }
    private int parseJson(JSONObject jo) throws Exception { if (jo != null) { int status = jo.getInt("status"); if (status == 0) { JSONObject ja = jo.getJSONObject("data"); String imgUrl = ja.getString("img_url"); loadRemoteImage(imgUrl); return 0; } } return -1; } private void callBack(Bitmap bm) { if (mCallback != null) { if (bm != null) { mCallback.onGetImgaeDone(bm); } else { mCallback.onGetImgaeDone(null); } } }   private String getSDCardPath() { return Environment.getExternalStorageDirectory().getAbsolutePath(); } }

    这段代码比较简陋,缺乏一些安全性处理。不过android客户端向服务器请求数据,大致就是这样的了,至于请求到的数据是直接处理还是下载到本地再处理,则需要根据实际情况来考虑。

    这里只是为了展示http的用法,所以都混在了一起,但在实际运用中,http请求、json的解析、远程图片的拉取等,都建议做封装。在实际操作中,request以及将文件写到本地,都存在超时的可能,所以建议开线程。

    在某个activity里面调用

    public class TestActivtiy extends Activity implements ImageUrlCallback {
      private static final int MSG_UPDATE_IMG=1000;
        private ImageView mImg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.test_activity);
            new ImageUrlGetter(TestActivtiy.this).getImg(this);
            super.onCreate(savedInstanceState);
        }
    
        private void initUI() {
            mImg = (ImageView) findViewById(R.id.test_img);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
        }
    
        @Override
        public void onGetImgaeDone(Bitmap bm) {
            mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_IMG, bm));
        }
    
        private Handler mHandler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
                if(msg.what==MSG_UPDATE_IMG){
                    if(msg.obj instanceof Bitmap){
                Bitmap bm = (Bitmap)msg.obj; mImg.setImageBitmap(bm); } }
    super.handleMessage(msg); } }; }
  • 相关阅读:
    Codeforces 1249 F. Maximum Weight Subset
    Codeforces 1249 E. By Elevator or Stairs?
    Codeforces 1249 D2. Too Many Segments (hard version)
    使用subline作为Stata外部编辑器,并实现代码高亮
    Getting a handle on
    Economics degrees
    The threat to world
    他山之石,calling by share——python中既不是传址也不是传值
    Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
    一梦江湖费六年——QQ群聊天分析
  • 原文地址:https://www.cnblogs.com/arthur3/p/3248442.html
Copyright © 2020-2023  润新知