日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android实现异步处理 -- HTTP请求

發(fā)布時間:2025/3/15 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android实现异步处理 -- HTTP请求 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原帖:http://www.cnblogs.com/answer1991/archive/2012/04/22/2464524.html

Android操作UI的方法不是線程安全的,也就是說開發(fā)者自己生成的線程對象是不能去操作UI的,比如在新線程里修改某個TextView,生成某個Toast。

?

? 為了能在處理耗時較長的業(yè)務(wù)、而又要兼顧我們的UI,不得不去新生產(chǎn)一個線程,但是這個線程不能兼顧到UI,能做的是向主線程發(fā)送更新UI的Message,由主線程的消息泵抓取到消息后并處理。

?

? Android也為開發(fā)者封裝了上述解決方案,就是用AsynTask。但是個人感覺這個不太好用,畢竟不同的任務(wù)需要去新編寫AsynTask,而這個AsynTask編寫起來也沒那么方便。還不如直接去實現(xiàn)Runnable接口,用自己的線程池和Handler去實現(xiàn)異步處理,(其實AsynTask就是封裝了一個線程池和一個Handler,有興趣的可以參考我的上一篇介紹AsynTask的博文)。

?

? 現(xiàn)在就來介紹如何自己去實現(xiàn)Android異步處理。

?

? 首先,異步處理需要新的一個線程,在這個線程里放上會阻塞的業(yè)務(wù),比如HTTP請求。那么我們需要一個線程池來管理自己的線程對象。具體使用java.util.concurrent.ThreadPoolExecutor類,concurrent是jdk 1.5新的一個包,為開發(fā)者提供線程以及和線程有關(guān)的一些機制。聽我的一個同學(xué)說,現(xiàn)在起就不要自己去new Thread()了,這樣會降低性能。我們應(yīng)該為整個應(yīng)用提供僅有的一個ThreadPoolExecutor對象,當(dāng)我們需要新的線程的時候,去那里取。

?

package com.chenjun.utils;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * 線程池輔助類,整個應(yīng)用程序就只有一個線程池去管理線程。 * 可以設(shè)置核心線程數(shù)、最大線程數(shù)、額外線程空狀態(tài)生存時間,阻塞隊列長度來優(yōu)化線程池。 * 下面的數(shù)據(jù)都是參考Android的AsynTask里的數(shù)據(jù)。 * @author zet * */ public class ThreadPoolUtils { private ThreadPoolUtils(){ } //線程池核心線程數(shù) private static int CORE_POOL_SIZE = 5; //線程池最大線程數(shù) private static int MAX_POOL_SIZE = 100; //額外線程空狀態(tài)生存時間 private static int KEEP_ALIVE_TIME = 10000; //阻塞隊列。當(dāng)核心線程都被占用,且阻塞隊列已滿的情況下,才會開啟額外線程。 private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>( 10); //線程工廠 private static ThreadFactory threadFactory = new ThreadFactory() { private final AtomicInteger integer = new AtomicInteger(); @Override public Thread newThread(Runnable r) { return new Thread(r, "myThreadPool thread:" + integer.getAndIncrement()); } }; //線程池 private static ThreadPoolExecutor threadPool; static { threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, threadFactory); } /** * 從線程池中抽取線程,執(zhí)行指定的Runnable對象 * @param runnable */ public static void execute(Runnable runnable){ threadPool.execute(runnable); } }

?

? ?有了線程池之后,我們就只要編寫自己的Runnable(或者是Callable)去實現(xiàn)業(yè)務(wù),然后交給線程池讓它分配線程并完成業(yè)務(wù)。

?

? ?這里的業(yè)務(wù)以Android的HTTP下載為例。

?

? ?對于Android的HTTP服務(wù),我們的整個應(yīng)用程序也只需要一個HttpClient對象,可以生成一個線程安全的HttpClient,這個HttpClient可以為我們多個HttpGet、HttpPost提供服務(wù)。具體代碼如下:

?

package com.chenjun.network.http;import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; /** * 輔助類,為整個應(yīng)用程序提供唯一的一個HttpClient對象。 * 這個對象有一些初始化的屬性連接屬性,這些屬性可以被HttpGet、HttpPost的屬性覆蓋 * @author zet * */ public class HttpClientHelper { private static HttpClient httpClient; private HttpClientHelper(){ } public static synchronized HttpClient getHttpClient(){ if(null == httpClient){ //初始化工作 HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); //設(shè)置連接管理器的超時 ConnManagerParams.setTimeout(params, 1000); //設(shè)置連接超時 HttpConnectionParams.setConnectionTimeout(params, 5000); //設(shè)置Socket超時 HttpConnectionParams.setSoTimeout(params, 10000); SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 80)); ClientConnectionManager conManager = new ThreadSafeClientConnManager(params, schReg); httpClient = new DefaultHttpClient(conManager, params); } return httpClient; } }

?

? ?這個HttpClient有一些初始化配置的屬性,如果HttpGet和HttpPost沒有設(shè)定特定的屬性,那么生成的HttpGet和 HttpPost會沿用HttpClient的初始化屬性。但是我們可以根據(jù)不同的情況,為HttpGet和HttpPost設(shè)置屬性,這些屬性將覆蓋掉 HttpClient的初始化屬性,這樣,我們得到的HttpGet和HttpPost就有特定的屬性了。

? ?

? ?具備以上的一些內(nèi)容,我們就可以在自己的Activity里去實現(xiàn)一個Runnable和Handler即可。在Runnable里完成我們的業(yè)務(wù)邏 輯,并適時的發(fā)送Message給Handler來更新UI,在Handler里處理Message并和UI交互。實例代碼:

?

package com.chenjun.httpdemo;import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Toast; import com.chenjun.asynctask.DownloadImageTask; import com.chenjun.network.http.HttpClientHelper; import com.chenjun.utils.ThreadPoolUtils; public class HttpDemoActivity extends Activity { private static final int START_DOWNLOAD_MESSAGE = 0x01; private static final int FINISH_DOWNLOAD_MESSAGE = 0x02; private static final int ERROR_DOWNLOAD_MESSAGE = 0x03; private Handler myHandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myHandler = new MyHandler(); ThreadPoolUtils.execute(new MyRunnable()); } private class MyRunnable implements Runnable{ @Override public void run() { HttpGet httpGet = new HttpGet("http://www.sina.com.cn"); //為這個HttpGet設(shè)置一些特定的屬性,別的屬性沿用HttpClient HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 60000); httpGet.setParams(params); myHandler.sendEmptyMessage(START_DOWNLOAD_MESSAGE); try { HttpResponse httpResponse = HttpClientHelper.getHttpClient().execute(httpGet);; byte[] bytes = EntityUtils.toByteArray(httpResponse.getEntity()); //在大多數(shù)情況下,這個下載下來的是XML或者Json。應(yīng)該解析完組裝成對象再放置到Message中。 //這里簡單起見,直接變成字符串打印了 String result = new String(bytes); Message msg = myHandler.obtainMessage(); msg.what = FINISH_DOWNLOAD_MESSAGE; msg.obj = result; myHandler.sendMessage(msg); } catch (Exception ex){ ex.printStackTrace(); myHandler.sendEmptyMessage(ERROR_DOWNLOAD_MESSAGE); } } } private class MyHandler extends Handler{ @Override public void dispatchMessage(Message msg) { switch(msg.what){ case START_DOWNLOAD_MESSAGE: Toast.makeText(HttpDemoActivity.this, "開始下載", Toast.LENGTH_SHORT).show(); break; case FINISH_DOWNLOAD_MESSAGE: Toast.makeText(HttpDemoActivity.this, "下載成功", Toast.LENGTH_SHORT).show(); //簡單起見,直接輸出了。 System.out.println(msg.obj); break; case ERROR_DOWNLOAD_MESSAGE: Toast.makeText(HttpDemoActivity.this, "下載失敗", Toast.LENGTH_SHORT).show(); break; default: System.out.println("nothing to do"); break; } } } }

?

? 總結(jié):個人有點不習(xí)慣用AsynTask,更傾向于這種寫法。也許Google開發(fā)的AsynTask有更為深遠(yuǎn)的意義,但是我暫時還沒領(lǐng)會到,所以就暫時沿用自己的這種寫法了。

轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/4925197.html

總結(jié)

以上是生活随笔為你收集整理的Android实现异步处理 -- HTTP请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品一区二区无码 | 奇米激情 | 耳光调教vk | 日韩毛片在线播放 | 97超碰中文 | 国产成人精品av在线观 | 一区二区三区在线观看av | 国产精品午夜久久 | 肥熟女一区二区三肥熟女 | 日韩在线观看免费高清 | 黄片一区二区 | 秋霞午夜影院 | 久久久久久久久久国产 | 熟妇人妻精品一区二区三区视频 | 欧美大奶在线 | 成人午夜视频在线免费观看 | 丰满少妇久久久久久久 | 国产一区二区欧美 | 日本一区二区三区视频免费看 | 成人av不卡| 色哟哟黄色 | 国产高清视频在线观看 | 日韩欧美一级大片 | 成人动漫亚洲 | 超碰在线网址 | 国产精品性爱在线 | 中国一级免费毛片 | jjzzjjzz欧美69巨大 | 五月婷婷深深爱 | 天天干干干 | 一区二区午夜 | 成人小片| 深爱五月激情网 | 叶山小百合av一区二区 | 手机看片日韩在线 | 亚州精品国产精品乱码不99按摩 | 三年在线观看视频 | 中文字幕免费高清在线观看 | 中文字幕视频网站 | 国内成人自拍 | 一区二区在线播放视频 | 国产50页 | 素人女裸体 | 波多野吉衣在线视频 | 午夜精品福利在线 | 阿娇全套94张未删图久久 | 加勒比hezyo黑人专区 | 中文字幕一区二区三区乱码不卡 | 少妇熟女一区二区 | 在线视频福利 | 性生交大片免费看视频 | 实拍女处破www免费看 | 亚洲理论视频 | 欧美巨大乳 | 中文字幕 自拍 | 亚洲AV无码国产日韩久久 | 免费国产精品视频 | 色女人网| 97中文字幕在线观看 | 韩国av电影在线观看 | 爱爱视频在线免费观看 | 欧美一区精品 | 欧美午夜精品 | 欧美人与禽zozzo性之恋的特点 | 日本不卡免费 | 国产资源免费 | 亚洲人精品午夜射精日韩 | 亚洲www啪成人一区二区麻豆 | 免费一级一片 | zzjj国产精品一区二区 | 免费av在线播放网址 | 蜜臀国产AV天堂久久无码蜜臀 | 欧洲女女同性videoso | 在线亚洲一区 | 亚洲一区天堂 | 欧美区日韩区 | 亚洲成人av在线 | 懂色av蜜臀av粉嫩av分享吧 | 少妇精品亚洲一区二区成人 | 日韩精品在线视频观看 | 日本一区二区在线观看视频 | 91在线精品秘密一区二区 | 一级做a爰片久久毛片 | 99国产精品久久久久久久成人 | 欧美一区二区三区在线观看视频 | aaa在线| 中文字幕亚洲精品在线 | 日本三级吃奶头添泬无码苍井空 | 国产av人人夜夜澡人人爽麻豆 | 热久久精 | 亚洲性自拍 | 中文字幕无线码 | 日本xxxx免费| 顶级黑人搡bbw搡bbbb搡 | 青青草国产精品视频 | aaa级片 | 黄色网址中文字幕 | 日本视频一区二区三区 | 日韩簧片在线观看 |