您的位置:首页 > 理论基础 > 计算机网络

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: