您的位置:首页 > 博客中心 > APP开发 >

(转载)Android之三种网络请求解析数据(最佳案例)

时间:2022-03-13 20:00

 

2016-07-25 18:02 4725人阅读 (0)   技术分享 分类:

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录

 

 

小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的:

 

                                                一:AsyncTask解析数据

 

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。

AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask<Void,Inetger,Void>:

  • Params是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型
  • Progress是指更新进度时传递的参数类型,即publishProgress()和onProgressUpdate()的参数类型
  • Result是指doInBackground()的返回值类型
上面的说明涉及到几个方法:
  • doInBackgound() 这个方法是继承AsyncTask必须要实现的,运行于后台,耗时的操作可以在这里做
  • publishProgress() 更新进度,给onProgressUpdate()传递进度参数
  • onProgressUpdate() 在publishProgress()调用完被调用,更新进度

1.下面我们来看看主函数的布局:activity_main.xml,其中,这几个方法除了主函数不一样之外,其他的代码都一样。

 

[html]  
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <EditText  
  7.         android:id="@+id/et_name"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentLeft="true"  
  11.         android:layout_alignParentTop="true"  
  12.         android:layout_marginLeft="15dp"  
  13.         android:layout_marginTop="28dp"  
  14.         android:ems="10" >  
  15.   
  16.         <requestFocus />  
  17.     </EditText>  
  18.   
  19.     <Button  
  20.         android:id="@+id/bt_search"  
  21.         android:layout_width="wrap_content"  
  22.         android:layout_height="wrap_content"  
  23.         android:layout_alignBottom="@+id/et_name"  
  24.         android:layout_toRightOf="@+id/et_name"  
  25.         android:onClick="search"  
  26.         android:text="搜索" />  
  27.   
  28.     <ListView  
  29.         android:id="@+id/listView"  
  30.         android:layout_width="match_parent"  
  31.         android:layout_height="wrap_content"  
  32.         android:layout_alignParentLeft="true"  
  33.         android:layout_below="@+id/et_name"  
  34.         android:layout_marginTop="26dp" >  
  35.     </ListView>  
  36.   
  37. </RelativeLayout>  

 

 

2.适配器的布局:list_item.xml

 

[html]  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/imageView"  
  9.         android:layout_width="60dp"  
  10.         android:layout_height="60dp"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_alignParentTop="true"  
  13.         android:src="@drawable/ic_launcher" />  
  14.   
  15.     <TextView  
  16.         android:id="@+id/textView1"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentTop="true"  
  20.         android:layout_toRightOf="@+id/imageView"  
  21.         android:text="TextView" />  
  22.   
  23.     <TextView  
  24.         android:id="@+id/textView2"  
  25.         android:layout_width="wrap_content"  
  26.         android:layout_height="wrap_content"  
  27.         android:layout_alignLeft="@+id/textView1"  
  28.         android:layout_below="@+id/textView1"  
  29.         android:text="TextView" />  
  30.   
  31.     <TextView  
  32.         android:id="@+id/textView3"  
  33.         android:layout_width="wrap_content"  
  34.         android:layout_height="wrap_content"  
  35.         android:layout_alignLeft="@+id/textView2"  
  36.         android:layout_below="@+id/textView2"  
  37.         android:text="TextView" />  
  38.   
  39. </RelativeLayout>  

3.  主函数 MainActivity.java

 

 

[java]  
  1. import java.io.IOException;  
  2. import java.io.InputStream;  
  3. import java.net.HttpURLConnection;  
  4. import java.net.URL;  
  5. import java.util.ArrayList;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.AsyncTask;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14. import android.widget.ListView;  
  15.   
  16. import com.bwie.test.Data1.MyData;  
  17. import com.google.gson.Gson;  
  18. import com.lidroid.xutils.HttpUtils;  
  19. import com.lidroid.xutils.exception.HttpException;  
  20. import com.lidroid.xutils.http.ResponseInfo;  
  21. import com.lidroid.xutils.http.callback.RequestCallBack;  
  22. import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;  
  23.   
  24. public class MainActivity extends Activity {  
  25.   
  26.     private EditText et_search;  
  27.     private ListView listView;  
  28.     private String trim;  
  29.     protected static final int SUCEESS = 0;  
  30.     private MyBaseAdapter adapter;  
  31.     ArrayList<MyData> myList = new ArrayList<MyData>();  
  32.   
  33.     private Button bt_search;  
  34.   
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.activity_main);  
  39.         et_search = (EditText) findViewById(R.id.et_name);  
  40.         bt_search = (Button) findViewById(R.id.bt_search);  
  41.         listView = (ListView) findViewById(R.id.listView);  
  42.         // "http://93.gov.cn/93app/get_search.do?key=九三"  
  43.   
  44.         bt_search.setOnClickListener(new OnClickListener() {  
  45.   
  46.             @Override  
  47.             public void onClick(View v) {  
  48.                 // TODO Auto-generated method stub  
  49.                 trim = et_search.getText().toString().trim();  
  50.                 String path = "http://93.gov.cn/93app/get_search.do?key="  
  51.                         + trim;  
  52.                 MyAsyncTask task = new MyAsyncTask();  
  53.                 task.execute(path);  
  54.             }  
  55.         });  
  56.     }  
  57.   
  58.     class MyAsyncTask extends AsyncTask<String, Void, String> {  
  59.   
  60.         @Override  
  61.         protected String doInBackground(String... params) {  
  62.   
  63.             try {  
  64.                 URL url = new URL(params[0]);  
  65.                 HttpURLConnection openConnection = (HttpURLConnection) url  
  66.                         .openConnection();  
  67.                 openConnection.setConnectTimeout(5000);  
  68.                 openConnection.setReadTimeout(5000);  
  69.                 int responseCode = openConnection.getResponseCode();  
  70.                 if (responseCode == 200) {  
  71.                     InputStream inputStream = openConnection.getInputStream();  
  72.                     StreamUtils streamUtils = new StreamUtils();  
  73.                     String parseStream = streamUtils.parseSteam(inputStream);  
  74.                     System.out.println("-----------parseStream------------"  
  75.                             + parseStream);  
  76.                     return parseStream;  
  77.                 }  
  78.             } catch (IOException e) {  
  79.                 // TODO Auto-generated catch block  
  80.                 e.printStackTrace();  
  81.             }  
  82.             return null;  
  83.         }  
  84.   
  85.         @Override  
  86.         protected void onPostExecute(String result) {  
  87.             super.onPostExecute(result);  
  88.             Gson gson = new Gson();  
  89.             Data1 fromJson = gson.fromJson(result,  
  90.                     Data1.class);  
  91.             System.out.println("-----------fromJson------------" + fromJson);  
  92.             ArrayList<MyData> data = fromJson.getData();  
  93.             listView.setAdapter(new MyBaseAdapter(  
  94.                     MainActivity.this, data));  
  95.         }  
  96.     }  
  97.   
  98. }  

 

 

4.适配器 MyBaseAdapter.java

 

[java]  
  1. import java.util.ArrayList;  
  2.   
  3. import com.bwie.test.Data1.MyData;  
  4. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  5. import com.nostra13.universalimageloader.core.ImageLoader;  
  6.   
  7. import android.content.Context;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.ImageView;  
  12. import android.widget.TextView;  
  13.   
  14. public class MyBaseAdapter extends BaseAdapter {    
  15.     private Context context;    
  16.     private ArrayList<MyData> list;  
  17.     private DisplayImageOptions initOptions;    
  18.     
  19.     public MyBaseAdapter(Context context, ArrayList<MyData> list) {    
  20.         this.context = context;    
  21.         this.list = list;    
  22.         //创建initOptions  
  23.         initOptions = ImageLoaderUtils.initOptions();  
  24.     }    
  25.     
  26.     @Override    
  27.     public int getCount() {    
  28.         return list.size();    
  29.     }    
  30.     
  31.     @Override    
  32.     public Object getItem(int arg0) {    
  33.         return null;    
  34.     }    
  35.     
  36.     @Override    
  37.     public long getItemId(int arg0) {    
  38.         return 0;    
  39.     }    
  40.     
  41.     @Override    
  42.     public View getView(int position, View convertView, ViewGroup viewGroup) {    
  43.         View view = View.inflate(context, R.layout.list_item, null);    
  44.         ImageView imageView = (ImageView) view.findViewById(R.id.imageView);    
  45.         TextView textView1 = (TextView) view.findViewById(R.id.textView1);    
  46.         TextView textView2 = (TextView) view.findViewById(R.id.textView2);    
  47.         TextView textView3 = (TextView) view.findViewById(R.id.textView3);    
  48.         textView1.setText(list.get(position).FROMNAME);    
  49.         textView2.setText(list.get(position).TITLE);    
  50.         textView3.setText(list.get(position).SHOWTIME);    
  51.         //图片缓存机制  
  52.         ImageLoader.getInstance().displayImage(list.get(position).IMAGEURL, imageView,initOptions);  
  53.           
  54.         return view;    
  55.     }    
  56.     
  57. }    


5.实体类 Data1.class

 

 

[java]  
  1. import java.util.ArrayList;  
  2.   
  3. public class Data1 {  
  4.     public ArrayList<MyData> data;  
  5.   
  6.     public class MyData{  
  7.         public String FROMNAME;  
  8.         public String IMAGEURL;  
  9.         public String SHOWTIME;  
  10.         public String TITLE;  
  11.     }  
  12.   
  13.     public ArrayList<MyData> getData() {  
  14.         return data;  
  15.     }  
  16.   
  17.     public void setData(ArrayList<MyData> data) {  
  18.         this.data = data;  
  19.     }  
  20.       
  21. }  

 

 

 

6.图片缓存工具类 ImageLoaderUtils.java

 

 

[java]  
  1. import android.content.Context;  
  2.   
  3. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  4. import com.nostra13.universalimageloader.core.ImageLoader;  
  5. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  6. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;  
  7.   
  8. public class ImageLoaderUtils {  
  9.     public static void initConfiguration(Context context) {  
  10.         Builder builder = new ImageLoaderConfiguration.Builder(context);  
  11.         ImageLoader.getInstance().init(builder.build());  
  12.     }  
  13.   
  14.     public static DisplayImageOptions initOptions() {  
  15.         DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()  
  16.                 .showImageOnLoading(R.drawable.ic_launcher)  
  17.                 .showImageForEmptyUri(R.drawable.ic_launcher)  
  18.                 .cacheInMemory(true).cacheOnDisk(true).build();  
  19.         return displayImageOptions;  
  20.     }  
  21. }  

7.   MyApplication.java

 

 

[java]  
  1. import android.app.Application;  
  2.   
  3. public class MyApplication extends Application {  
  4.     public void onCreate() {  
  5.         //初始化操作  
  6.         ImageLoaderUtils.initConfiguration(getApplicationContext());  
  7.     };  
  8. }  

8. 工具类 StreamUtils.java

 

 

 

[java]  
  1. import java.io.ByteArrayOutputStream;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4.   
  5. public class StreamUtils {  
  6.     public static String parseSteam(InputStream inputStream) {  
  7.         try {  
  8.             // 定义一个字节数组输出流  
  9.             ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();  
  10.             // 定义一个字节数组  
  11.             byte[] buffer = new byte[1024];  
  12.             // 定义初始长度  
  13.             int len = 0;  
  14.             while ((len = inputStream.read(buffer)) != -1) {  
  15.                 // 将读的内容,写到字节数组输出流中  
  16.                 arrayOutputStream.write(buffer, 0, len);  
  17.             }  
  18.             // 将字节输出流转成字符串  
  19.             return arrayOutputStream.toString("utf-8");  
  20.             // utf-8 大小写都可以,gbk 必须大写  
  21.         } catch (IOException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.         return null;  
  25.     }  
  26. }  

  到这里,一个案例就结束啦,下面的两个主函数是其他两个网络请求方法,只是主函数代码不同,其他的代码是相同的哦。

 

 

                                                            二.HttpURLConnection解析数据

针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验做如下总结: 
1:> URL请求的类别: 
分为二类,GET与POST请求。二者的区别在于: 
     a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, 
     b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

 

 

请求响应流程

  技术分享

设置连接参数的方法

 

 

  • setAllowUserInteraction
  • setDoInput
  • setDoOutput
  • setIfModifiedSince
  • setUseCaches
  • setDefaultAllowUserInteraction
  • setDefaultUseCaches

 

 

设置请求头或响应头

HTTP请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作的方法:

 

  • setRequestProperty(key,value)
  • addRequestProperty(key,value)

 

setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。

 

发送URL请求

 

建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:

 

  • getOutputStream 

 

获取响应

请求发送成功之后,即可获取响应的状态码,如果成功既可以读取响应中的数据,获取这些数据的方法包括:

 

 

  • getContent
  • getHeaderField
  • getInputStream 

 

 

对于大部分请求来说,getInputStream和getContent是用的最多的。

相应的信息头用以下方法获取:

 

 

 

  • getContentEncoding
  • getContentLength
  • getContentType
  • getDate
  • getExpiration
  • getLastModifed 

 

 

HttpURLConnection

任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。

虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。

 

 

1.主函数  MaActivity.class

 

 

[java]  
  1. import java.io.InputStream;  
  2. import java.net.HttpURLConnection;  
  3. import java.net.URL;  
  4. import java.util.ArrayList;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.ListView;  
  14.   
  15. import com.bwie.test.Data1.MyData;  
  16. import com.google.gson.Gson;  
  17. import com.lidroid.xutils.HttpUtils;  
  18. import com.lidroid.xutils.exception.HttpException;  
  19. import com.lidroid.xutils.http.ResponseInfo;  
  20. import com.lidroid.xutils.http.callback.RequestCallBack;  
  21. import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;  
  22.   
  23. public class MainActivity extends Activity {  
  24.   
  25.     private EditText et_search;  
  26.     private ListView listView;  
  27.     private String trim;  
  28.     protected static final int SUCEESS = 0;  
  29.     private MyBaseAdapter adapter;  
  30.     ArrayList<MyData> myList = new ArrayList<MyData>();  
  31.      Handler handler = new Handler() {    
  32.             private MyBaseAdapter myBaseAdapter;    
  33.         
  34.             public void handleMessage(android.os.Message msg) {    
  35.                 if (msg.what == SUCEESS) {    
  36.                     Data1 chatInfo = (Data1) msg.obj;    
  37.                     // 展示到listView上边 数据成功    
  38.                    
  39.                         myList.addAll(chatInfo.data);    
  40.                         if (myBaseAdapter == null) {    
  41.                             myBaseAdapter = new MyBaseAdapter(MainActivity.this, myList);    
  42.                             listView.setAdapter(myBaseAdapter);    
  43.                         } else {    
  44.                             myBaseAdapter.notifyDataSetChanged();    
  45.                         }    
  46.                     }    
  47.                   
  48.             };    
  49.         };    
  50.     private Button bt_search;  
  51.   
  52.     @Override  
  53.     protected void onCreate(Bundle savedInstanceState) {  
  54.         super.onCreate(savedInstanceState);  
  55.         setContentView(R.layout.activity_main);  
  56.         et_search = (EditText) findViewById(R.id.et_name);  
  57.         bt_search = (Button) findViewById(R.id.bt_search);  
  58.         listView = (ListView) findViewById(R.id.listView);  
  59.         // "http://93.gov.cn/93app/get_search.do?key=九三"  
  60.   
  61.         bt_search.setOnClickListener(new OnClickListener() {  
  62.   
  63.             @Override  
  64.             public void onClick(View v) {  
  65.                 // TODO Auto-generated method stub  
  66.                 trim = et_search.getText().toString().trim();  
  67.                 String path = "http://93.gov.cn/93app/get_search.do?key="  
  68.                         + trim;  
  69.                 // 请求数据  
  70.                 getHttp(path);  
  71.             }  
  72.         });  
  73.     }  
  74.   
  75.     protected void getHttp(final String path) {  
  76.         // TODO Auto-generated method stub  
  77.          new Thread() {    
  78.                 public void run() {    
  79.                     try {    
  80.                         // http://v.juhe.cn/weixin/query?key=您申请的KEY    
  81.                         // 0917c812f187b92e025c9b7c2d4e59b5 pno    
  82.                         URL url = new URL(path);    
  83.                         HttpURLConnection openConnection = (HttpURLConnection) url    
  84.                                 .openConnection();    
  85.                         openConnection.setConnectTimeout(5000);    
  86.                         openConnection.setReadTimeout(5000);    
  87.                         int responseCode = openConnection.getResponseCode();    
  88.                         if (responseCode == 200) {    
  89.                             InputStream inputStream = openConnection    
  90.                                     .getInputStream();    
  91.                             String parseSteam = StreamUtils.parseSteam(inputStream);    
  92.                             Gson gson = new Gson();    
  93.                             Data1 weiChatInfo = gson.fromJson(parseSteam,    
  94.                                     Data1.class);    
  95.                             // 展示到listView上    
  96.                             handler.obtainMessage(SUCEESS, weiChatInfo)    
  97.                                     .sendToTarget();    
  98.                         }    
  99.                     } catch (Exception e) {    
  100.                         e.printStackTrace();    
  101.                     }    
  102.                 };    
  103.             }.start();    
  104.     }  
  105.   
  106. }  

                                           **其他的代码在一种复制即可,是通用的**

 

 



                                三.XUtils解析数据 (记得降版本,版本高会报错)

 

 

1. 功能介绍

 

 

xUtils一个公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块。

  • View模块主要的功能是通过注解绑定UI,资源,事件。

  • Db模块是一个orm框架, 简单的语句就能进行数据的操作。

  • Http模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。

  • Bitmap模块是加载图片以及图片的处理, 支持加载本地,网络图片。而且支持图片的内存和本地缓存。

(具体介绍在下面...)

1.主函数  MaActivity.class

 

 

[java]  
  1. import java.util.ArrayList;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. import android.widget.EditText;  
  9. import android.widget.ListView;  
  10.   
  11. import com.bwie.test.Data1.MyData;  
  12. import com.google.gson.Gson;  
  13. import com.lidroid.xutils.HttpUtils;  
  14. import com.lidroid.xutils.exception.HttpException;  
  15. import com.lidroid.xutils.http.ResponseInfo;  
  16. import com.lidroid.xutils.http.callback.RequestCallBack;  
  17. import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;  
  18.   
  19. public class MainActivity extends Activity {  
  20.   
  21.     private EditText et_search;  
  22.     private ListView listView;  
  23.     private String trim;  
  24.     protected static final int SUCEESS = 0;  
  25.     private MyBaseAdapter adapter;  
  26.     ArrayList<MyData> myList = new ArrayList<MyData>();  
  27.   
  28.     private Button bt_search;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.         et_search = (EditText) findViewById(R.id.et_name);  
  35.         bt_search = (Button) findViewById(R.id.bt_search);  
  36.         listView = (ListView) findViewById(R.id.listView);  
  37.         // "http://93.gov.cn/93app/get_search.do?key=九三"  
  38.   
  39.         bt_search.setOnClickListener(new OnClickListener() {  
  40.   
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 // TODO Auto-generated method stub  
  44.                 trim = et_search.getText().toString().trim();  
  45.                 String path = "http://93.gov.cn/93app/get_search.do?key="  
  46.                         + trim;  
  47.                 // 请求数据  
  48.                 getHttp(path);  
  49.             }  
  50.         });  
  51.     }  
  52.   
  53.     protected void getHttp(String path) {  
  54.         // TODO Auto-generated method stub  
  55.         HttpUtils utils = new HttpUtils();  
  56.         utils.send(HttpMethod.GET, path, new RequestCallBack<String>() {  
  57.   
  58.             private MyBaseAdapter adapter;  
  59.   
  60.             @Override  
  61.             public void onFailure(HttpException arg0, String arg1) {  
  62.                 // TODO Auto-generated method stub  
  63.   
  64.             }  
  65.   
  66.             @Override  
  67.             public void onSuccess(ResponseInfo<String> arg0) {  
  68.                 String result = arg0.result;  
  69.                 Gson gson = new Gson();  
  70.                 Data1 bean = gson.fromJson(result, Data1.class);  
  71.                 ArrayList<MyData> list = new ArrayList<MyData>();  
  72.                 list.addAll(bean.data);  
  73.                 if (adapter == null) {  
  74.   
  75.                     adapter = new MyBaseAdapter(MainActivity.this, list);  
  76.                 } else {  
  77.                     adapter.notifyDataSetChanged();  
  78.                 }  
  79.                 listView.setAdapter(adapter);  
  80.   
  81.             }  
  82.         });  
  83.     }  
  84.   
  85. }  

 最后的配置一定不要忘记啦:

 

 

[java]  
  1. android:name="com.bwie.test.MyApplication"  
[java]  
  1. android:name="android.permission.INTERNET"/>  
 

 

      到这里三个网络请求解析数据的案例就完工啦,下面是XUtils 的详细介绍:

 

2. 详细设计

 

2.1 View模块

 

2.1.1 总体设计

 

流程和关系较少, 请看下面的详细分析

 

2.1.2 流程图

技术分享

2.1.3 核心类功能介绍

请先了解注解 ,动态代理 可以帮助到您, 如果已经了解请忽略。

注解和反射知识是这个模块的主要内容

1.ViewUtils.java

View和各种事件的注入以及资源的注入。

(1)主要函数
[js]  
  1. private static void injectObject(Object handler, ViewFinder finder)  

第一个参数Object handler代表的是需要注入的对象, 第二个参数是需要注入View(这个View就是handler的成员变量)所在的View或者Activity的包装对象。 该方法完成了View和各种事件的注入以及资源的注入。主要的原理就是通过反射和注解。

  • 完成Activity的setContentView。

  • 完成View的注入。

  • 完成资源的注入。

  • 完成各种事件的注入。

2.ViewFinder.java

(1)主要函数
[js]  
  1. public View findViewById(int id, int pid)  
  2. public View findViewById(int id)  

如果存在父View, 优先从父View寻找,否则从当前的View或者Activity中寻找。

3.ResLoader.java

[js]  
  1. public static Object loadRes(ResType type, Context context, int id)  

获取资源文件值。支持多种资源的获取。

4.EventListenerManager.java

事件的注入, 其中的设计是通过动态代理。

[js]  
  1. private final static DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object> listenerCache =  
  2.             new DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object>();  

存放监听事件接口map。 因为有些接口有多个函数, 代理会判断事件接口是否存在, 如果存在只增加代理方法就够了, 避免重新设置监听事件接口。

[js]  
  1. public static void addEventMethod(  
  2.             ViewFinder finder,  
  3.             ViewInjectInfo info,  
  4.        &n

相关推荐

电脑软件

本类排行

今日推荐

热门手游