正文  网络通信 > HTTP >

Android简单封装类似JQuery异步请求

在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作,会有溢出的问题,(当然一般情况不会有那么多线......

在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作,会有溢出的问题,(当然一般情况不会有那么多线程同时工作的)所以写了这个代码,还望高手指正!

 [Java]代码

01 package com.xbl.task;
02  
03 import java.io.BufferedReader;
04 import java.io.InputStream;
05 import java.io.InputStreamReader;
06 import java.net.URL;
07 import java.util.concurrent.Executor;
08 import java.util.concurrent.ExecutorService;
09 import java.util.concurrent.Executors;
10  
11 import android.os.Bundle;
12 import android.os.Handler;
13 import android.os.Message;
14 import android.util.Log;
15  
16  
17 public class JQuery {
18     
19     private static final String KEY = "key";
20     private static String TAG = "JQuery";
21     private static final int N = 5;// 5个工人 
22     private static final Executor worker = Executors.newFixedThreadPool(N);// 线程池
23     private static final Handler handler = new Handler(){
24         @Override
25         public void handleMessage(Message msg) {
26             TaskListener listener = (TaskListener)msg.obj;
27             Object result = msg.getData();
28             if(listener !=null ){
29                 listener.callBack(result);
30             }
31             destory();
32         }
33     };
34     
35     private JQuery(){      
36     }
37     
38     public static void execute(final String url,final TaskListener listener){
39         worker.execute(new Runnable() {
40             @Override
41             public void run() {
42                 String result = null;
43                 try {
44                     result = WebUtil.get(url);
45                 } catch (Exception e) {
46                     Log.e(TAG, e.getMessage());
47                 }
48                 
49                 Message msg = new Message();
50                 Bundle data = new Bundle();
51                 data.putSerializable(KEY, result);
52                 msg.setData(data);
53                 msg.obj = listener;
54                 handler.sendMessage(msg);
55             }
56         });
57     }
58     
59     //销毁线程
60     private static void destory() {
61         if (worker != null && worker instanceof ExecutorService) {
62             ExecutorService es = (ExecutorService) worker;
63             if (!es.isShutdown()) {
64                 es.shutdown();
65             }
66         }
67     }  
68     
69     public interface TaskListener{
70         public void callBack(Object result);
71     }
72     /**
73      *
74      * 不必太在意此处代码,只是示例
75      *
76      */
77     public static class WebUtil{
78         
79         public static String get(String url) throws Exception{
80             InputStream inputStream = new URL(url).openStream();
81             StringBuilder strBuilder = new StringBuilder();
82             BufferedReader reader = new BufferedReader(newInputStreamReader(inputStream));
83             for (String s = reader.readLine(); s != null; s = reader.readLine())
84                 strBuilder.append(s);
85             
86             inputStream.close();
87             return strBuilder.toString();
88         }
89     }
90 }

[代码] [Java]代码

01 //调用方法:
02 JQuery.execute("http://weather.news.qq.com/inc/minisite_125.js", newJQuery.TaskListener() {               
03                 @Override
04                 public void callBack(Object result) {
05                     TextView t = new TextView(TaskDemoActivity.this);
06                     t.setText(String.valueOf(result));
07                     LinearLayout layout = (LinearLayout)findViewById(R.id.layout1);
08                     layout.addView(t);
09                 }
10             });