Android使用AsyncTask异步请求网络

来源:互联网 发布:java高级程序员 编辑:程序博客网 时间:2024/05/16 10:47

刚忙完,已经凌晨了。顺便给大家写了一个缩小版的异步网络框架。这个缩小版的网络框架也是挺实用的。有需要完善的请跟我联系,大家一起完善。后面可给大家下载,直接使用。因为真实项目中是需要反复使用的,所以网络框架是非常重要的。我们常用的有Volley,这个小框架大家可以在小项目中使用,代码精简,但是思想最重要。学思想比敲代码更重要。

大家知道,post和get方式请求网络存在区别。post方式相对安全,因为不会直接把参数附带在链接后面,而get方式就需要把链接完整地写出来。最后,再打开输入输出流进行读写操作。我也不说什么过多的东西,思路给大家整明白点,post和get的区别还请大家百度。

Android不可在UI线程中进行网络请求,目的是为了防止阻塞,也就是不可以在主线程中请求网络。那么我们可以使用AsyncTask来进行异步任务。

AsyncTask有两个重写方法我们要用到,一个是doInBackground执行方法,另外一个是onPostExecute方法。

首先,我们新建立一个包,老手不用看了,直接下载用就ok了,新手我还是说一下吧!图中的net包就是网络请求包。里面存放了网络请求基类,图中的BaseHttpsConnection.java这个类。

BaseHttpsConnection.java代码如下:

package net;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.URL;import java.net.URLConnection;import android.os.AsyncTask;import android.util.Log;import com.mero.test.Config;import com.mero.test.HttpMethod;public class BaseHttpsConnection{//http网络基类,用于请求web服务器private static final String TAG = "baseNetTag";//用于网络访问的TAG日志public BaseHttpsConnection(final String url,final HttpMethod httpMethod,final SuccessCallback successCallback,final FailedCallback failedCallback,final String...kvs){new AsyncTask<Void, Void, String>(){@Overrideprotected String doInBackground(Void... params) {StringBuffer paramsStr=new StringBuffer();//创建字符串连接对象for(int i=0;i<kvs.length;i+=2){paramsStr.append(kvs[i]).append("=").append(kvs[i+1]).append("&");}paramsStr.deleteCharAt(paramsStr.length()-1);try{URLConnection uc = null;switch(httpMethod){case POST:uc = new URL(url).openConnection();uc.setDoOutput(true);//数据通道设置BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(uc.getOutputStream(), Config.CHARSETNAME));bw.write(paramsStr.toString());//把数据写到缓冲区break;case GET:uc=new URL(url+"?"+paramsStr.toString()).openConnection();Log.e(TAG, url+"?"+paramsStr.toString());break;}BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream(), Config.CHARSETNAME));//打开输入流String line=null;StringBuffer result=new StringBuffer();while((line=br.readLine())!=null){result.append(line);}Log.e("TAG", result.toString());return result.toString();}catch(Exception e ){e.printStackTrace();}return null;}protected void onPostExecute(String result) {if(result!=null){if(successCallback!=null){successCallback.onSuccess(result);}else if(failedCallback!=null){failedCallback.onFailed();}}};}.execute();}//成功回调接口public static interface SuccessCallback{void onSuccess(String result);}//失败回调接口public static interface FailedCallback{void onFailed();}}

枚举类HttpMethod.java类如下:  

package com.haihong.iotclient.net;public enum HttpMethod {POST,GET}


好了,上面的框架就搭建好了。
咱们该怎么使用呢?其实也很简单。


假设我现在需要请求网络,那么我新建一个通信类。假如我是要拿到服务器返回的JSON数据。

咱们新建一个GetServerOpenData.java类。

该类代码演示如下:  

package com.haihong.iotclient.net;import org.json.JSONException;import org.json.JSONObject;import android.util.Log;import com.haihong.iotclient.Config;/** *@项目名称: server *@文件名称: GetServerOpenData.java *@Date: 2016-9-16 *@Copyright: 2016 Technology Mero Inc. All rights reserved. */public class GetServerOpenData {/** * 得到server返回数据通信类 */public GetServerOpenData(String ip,String card,final SuccessCallback successCallback,final FailedCallback failedCallback) {new BaseHttpsConnection(Config.URL, HttpMethod.GET, new BaseHttpsConnection.SuccessCallback() {@Overridepublic void onSuccess(String result){System.out.println(result);JSONObject jsonObject = null;try {jsonObject = new JSONObject(result);} catch (JSONException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}boolean data = false;try {data = jsonObject.getBoolean("data");Log.e("TAG",String.valueOf(data));} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(data==true){if(null!=successCallback){System.out.println("成功了");successCallback.onSuccess();}}else{if(null!=failedCallback){failedCallback.onFailed();System.out.println("失败了");}}}}, new BaseHttpsConnection.FailedCallback() {@Overridepublic void onFailed() {if(null!=failedCallback){failedCallback.onFailed();}}}, Config.KEY_ACTION,Config.KEY_IS_CAN_OPENED,Config.KEY_IP,ip,Config.KEY_CARD,card);}public static interface SuccessCallback{void onSuccess();}public static interface FailedCallback{void onFailed();}}


我们然后就可以直接点击进行网络请求,比如有个按钮。我还是新建立一个Activity演示下吧!

public class MainActivity extends Activity implements OnClickListener{private Button btn_test;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }private void initView() {btn_test = (Button) findViewById(R.id.btn_http_connect);btn_test.setOnClickListener(this);}/* (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_http_connect:Toast.makeText(this, "正在请求网络", Toast.LENGTH_SHORT).show();new GetServerOpenData("162.66.22.33", "222221113c", new GetServerOpenData.SuccessCallback() {@Overridepublic void onSuccess() {Log.e("TAG", "成功了");}},new GetServerOpenData.FailedCallback() {@Overridepublic void onFailed() {Log.e("TAG", "失败了");}} );break;default:break;}}    }
咱们只需要在这里执行成功和失败的内容即可。

当我们想用POST的时候,咱们只需要把上面代码中的GET改成POST即可。没法把整个项目源码给大家分享了,只把其中的网络请求拿出来给大家学习一下。

请求后得到的结果如下:

好了,上面就是全部的代码。下面给出下载链接,大家直接新建立一个net网络包,然后导入即可。Mero的QQ:790710371,欢迎共同学习,共同进步。谢谢阅读!

下载地址



1 0