8-20 HttpURLConnection Volley android-async-http WebService WebView笔记待整理



Android网络请求编程

网络请求是Android开发中必备的功能之一,如果一个APP没有网络功能,甚至都不能称为一个
完整的APP,客户端的数据处理能力是有限的,数据的存储能力也是有限的,这就需要依赖
功能强大的后台服务器。通过与服务器之间的连接,来获取数据,或上传客户端数据是APP开发
中非常常见的功能。

如何与服务器端进行通讯?

通常与服务器之间的通讯都使用HTTP协议,HTTP协议是基于TCP底层协议的上层协议。
在Android开发中,HTTP请求的的选择有很多,除了自己用HttpURLConnection封装
请求框架,很多第三方的请求组件在项目开发中也应用非常广泛,
比如Volley,android-async-http,okhttp

1、检查网络

访问网络时添加权限:

  

 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

检查网络的工具类  可以直接调用


public class HttpUtils {

    //检查网络是否可用
    public static boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    //判断WIFI网络是否可用?
    public static boolean isWifiConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mWiFiNetworkInfo != null) {
                return mWiFiNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    //判断MOBILE网络是否可用
    public static boolean isMobileConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (mMobileNetworkInfo != null) {
                return mMobileNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    //获取当前网络连接的类型信息
    public static int getConnectedType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()){
                return mNetworkInfo.getType();
            }
        }
        return -1;
    }
}


2、使用HttpURLConnection实现网络请求

网络请求的方式通常有:

get请求:显式请求,最大数据是4KB,参数会在URL上显示,不安全,请求速度快

post请求:隐式请求,数据大小没有限制,参数以流的方式传输,不显示在URL上,安全

                请求速度较慢。通常对请求参数安全性要求高,数据量大的请求都要使用post

                

<1>显示网络图片示例:

  

 public void showImageClick(View view){
        new ShowImageAsyncTask().execute("http://img0.imgtn.bdimg.com/it/u=2263418180,3668836868&fm=206&gp=0.jpg");
    }
    private class ShowImageAsyncTask extends AsyncTask<String,Integer,Bitmap>{

        @Override
        protected Bitmap doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                InputStream in = url.openStream();
                Bitmap bitmap = BitmapFactory.decodeStream(in);
                return bitmap;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            imageView.setImageBitmap(bitmap);
        }
    }




3、Volley组件的使用

<1>一个简单的字符串请求(GET)

 private void stringRequestMethod1(){
        int  method = Request.Method.GET;  //请求方式
        String url = "http://www.baidu.com"; //请求地址
        //请求成功后的回调接口
        Response.Listener listener = new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(VolleyActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };
        //请求失败后回调的接口
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(VolleyActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        };
        //创建请求对象
        StringRequest get = new StringRequest(method,url,listener,errorListener);
        queue.add(get);


        

<2>StringRequest带参数请求:

   

 private void stringRequestMethod2(){
        int method = Request.Method.POST;
        String url = "http://192.168.1.2:8080/AndroidServer/LoginServlet";
        //请求成功后的回调接口
        Response.Listener listener = new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                System.out.println(s);
                Log.i("VolleyActivity",s);
                //Toast.makeText(VolleyActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };
        //请求失败后回调的接口
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i("VolleyActivity",volleyError.getMessage());
                Toast.makeText(VolleyActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        };
        StringRequest post = new StringRequest(method,url,listener,errorListener){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params = new HashMap<>();
                params.put("username","admin");
                params.put("password","123");
                return params;
            }
        };
        queue.add(post);
    }       



<3>JsonRequest请求

  

 //发送一个JSON请求
    public void sendJSONRequestClick(View view){
        String url = "http://192.168.1.2:8080/AndroidServer/JsonServlet";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        try {
                            String name = jsonObject.getString("name");
                            String age = jsonObject.getString("age");
                            Toast.makeText(VolleyActivity.this, name+"-"+age, Toast.LENGTH_SHORT).show();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i("VolleyActivity",volleyError.getMessage());
            }
        });
        queue.add(request);
    }



<4>发送一个图片请求

 

  public void sendImageRequestClick(View view){
        String url = "http://d.hiphotos.baidu.com/image/h%3D200/sign=8d437f388294a4c21523e02b3ef51bac/3812b31bb051f819ddd39d7ddfb44aed2e73e717.jpg";
        ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                iv.setImageBitmap(bitmap);
            }
        }, 200, 200, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i("VolleyActivity",volleyError.getMessage());
            }
        });
        queue.add(request);
    }    
ImageRequest参数:
url:请求路径
Listener :请求成功后的回调接口
maxWidth:图片最大的宽度,0为原始宽度
maxHeight:图片最大的高度,0为原始高度
Config:颜色属性,图片显示的质量
                <span style="font-size:14px;color:#FF0000;"><strong>RGB_565</strong>  每个像素占2个字节,<strong>ARGB_8888</strong>  每个像素占4个字节</span>
ErrorListener:请求失败后的回调接口




4、android-async-http组件的使用

android-async-http是个人开发者james smith开发,用于网络数据请求,在处理网络数据
、下载、上传,等功能实现。


使用async-http,首先实例化:

AsyncHttpClient client = new AsyncHttpClient();



 <1>AsyncHttpResponseHandler

   

 /**
     * 发送一个异步请求
     * @param view
     */
    public void asyncHttpResponseHandlerClick(View view){
        String url = "http://192.168.1.2:8080/AndroidServer/LoginServlet";
        RequestParams params = new RequestParams();
        params.add("username","admin");
        params.add("password","123");
        //get请求,post请求
        client.post(this, url, params, new AsyncHttpResponseHandler() {
            //http状态码:500 服务器内部错误,404 找不到资源
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if(statusCode==200){
                    Log.i("Server",new String(responseBody));
                }
            }
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.i("Server",new String(responseBody));
            }
        });
    }


 <2>文件上传

 

    打开图库选择图片

   

 public void selectImageClick(View v){
        //打开图库
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//        intent.setType("image/*");
        startActivityForResult(intent,SELECT_IMAGE_CODE);
    }
    
    通过onActivityResult获取图库返回的uri,通过contentProvider查询图片的实际路径
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK && requestCode==SELECT_IMAGE_CODE){
            Uri uri = data.getData();
            Log.i("imageUri",uri.toString());
            Cursor c = getContentResolver().query(uri,new String[]{MediaStore.Images.ImageColumns.DATA},null,null,null);
            if(c.moveToFirst()){
                String path = c.getString(0);
                System.out.println(path);
                textView_path.setText(path);
            }
            c.close();
//            System.out.println(path);
        }
    }

    // 上传
    public void fileUploadClick(View view){
        String path = textView_path.getText().toString();
        if (TextUtils.isEmpty(path)){
            return;
        }
        String url = "http://192.168.1.2:8080/AndroidServer/UploadServlet";
        RequestParams params = new RequestParams();

        //String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/2.png";
        try {
            params.put("2.png",new File(path));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        client.post(this, url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                Toast.makeText(AndroidAsyncHttpActivity.this, new String(responseBody), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.e("upload",new String(responseBody));
            }
        });
    }


 

 <3>下载:FileAsyncHttpResponseHandler

   

 public void downloadClick(View view){
        String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1469521746&di=915bda4a1b76e77cffa6ade36fc32dde&src=http://b.hiphotos.baidu.com/image/pic/item/810a19d8bc3eb135aa449355a21ea8d3fc1f4458.jpg";
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/1.jpg";
        File file = new File(path);
        //new FileAsyncHttpResponseHandler(file) 传入一个目标文件,用于接收下载的文件
        client.get(this, url, new FileAsyncHttpResponseHandler(file) {
            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {
                Log.i("Download","onFailure");
            }
            @Override
            public void onSuccess(int statusCode, Header[] headers, File file) {

                Log.i("Download",file.getAbsolutePath());
                Log.i("Download","SUCCESS");
            }
        });
    }



<4>JsonHttpResponseHandler 处理JSON数据(参数和返回值都 JSON)

  

 public void jsonClick(View view){
        String url = "http://192.168.1.2:8080/AndroidServer/JsonServlet";
        JSONObject object = new JSONObject();
        StringEntity entity = null;
        try {
            object.put("username","admin");
            object.put("password","123");
            entity = new StringEntity(object.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        client.get(this,url,entity,"application/json",new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                try {
                    String name = response.getString("name");
                    String age = response.getString("age");
                    Log.i("JSON",name+"-"+age);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }



5、WebService

SOAP协议(基于HTTP协议)
WSDL  webService定义语言(XML)
用于实现不同平台,不同语言,不同技术,实现共同协作的一种技术
在Android中调用webService,我们通常使用google提供的调用webservice的组件包
ksoap2


6、WebView


一个webView可以看作是一个轻量级的浏览器,用于实现使用web技术实现界面的展示,和
视频的播放

<1>webView的基本使用
    /**
     * 初始化webview
     */
    private void initWebView() {
        webView = (WebView) findViewById(R.id.webView);
        //获取webView的设置
        WebSettings ws = webView.getSettings();
        ws.setJavaScriptEnabled(true);//是否支持JS
        ws.setDisplayZoomControls(true);
        ws.setBuiltInZoomControls(true);
		//解决网页不在Activity加载的问题 
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                webView.loadUrl(url);
                return true;
            }
        });
//        webView.setWebChromeClient(new WebChromeClient(){
//
//        });\
		//android中调用JS代码
		//把对象暴露给JS调用
        webView.addJavascriptInterface(new MyObject(),"obj");
//        webView.loadUrl("http://www.baidu.com");
        webView.loadUrl("file:///android_asset/index.html");
    }
    private Handler handler = new Handler();

    class MyObject{
		//在方法中调用JS代码的函数
        @JavascriptInterface
        public void clickOnAndroid(final String value){
            handler.post(new Runnable() {
                @Override
                public void run() {
                    webView.loadUrl("javascript:funcOver('"+value+"')");
                }
            });
        }
    }
	
	//解决网页链接跳转后,back键回退的问题
	    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && webView.canGoBack()){
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}
	



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值