8-20 HttpURLConnection Volley android-async-http WebService WebView笔记待整理
2016-07-26 19:28
579 查看
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. 4000 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);
}
}
相关文章推荐
- angularJs的那些坑——$http服务
- HTTP状态码206
- UDP和TCP协议详解
- 网络基础常识
- HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传
- Android基础总结(9)——网络技术
- 程序包org.apache.http不存在,解决方式
- HttpServletRequest request 获取form参数的两种方式
- Ubuntu 14.04 安装 Sublime Text 3
- 高负载系统,内核网络参数的设置 sysctl
- iOS 9网络联网问题
- AFNetworiking与ASIHttpRequest对比
- linux网络编程之简单的服务器多线程
- Android Http POST请求
- Java烧脑驴游(十五)--Http code
- netstat 查看TCP网络连接情况
- QT 网络模块QAbstractSocket类阅读
- iOS中关于判读网络状态的问题,使用AFN
- RabbitMQ - TcpConnection析构引发的一次handshake_timeout
- 机器学习与R之BP神经网络