POSTpython多线程post请求求助

Android基础之多线程详解
使用线程处理 耗时比较长的&业务& &
有以下几种方式: &
1)Activity.runOnUiThread(Runnable) &
2)View.post(Runnable) ;View.postDelay(Runnable , long) &
3)Handler &
4)AsyncTask &
Android是单线程模型,这意味着Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,所以你单纯的new一个Thread并且start()是不行的,因为这违背了Android的单线程模型。那么如何用好多线程呢?总结一下:&
事件处理的原则:所有可能耗时的操作都放到其他线程去处理。 &
  Android中的Main线程的事件处理不能太耗时,否则后续的事件无法在5秒内得到响应,就会弹出ANR对话框。那么哪些方法会在 Main线程执行呢? &
  1) Activity的生命周期方法,例如:onCreate()、onStart()、onResume()等 &
  2) 事件处理方法,例如onClick()、onItemClick()等 &
  通常Android基类中以on开头的方法是在Main线程被回调的。 &
  提高应用的响应性,可以从这两方面入手。 &
  一般来说,Activity的onCreate()、onStart()、onResume()方法的执行时间决定了你的应用首页打开的时间,这里要尽量把不必要的操作放到其他线程去处理,如果仍然很耗时,可以使用SplashScreen。使用SplashScreen最好用动态的,这样用户知道你的应用没有死掉。&
 当用户与你的应用交互时,事件处理方法的执行快慢决定了应用的响应性是否良好,一般分为同步和异步两种情况: &
  1) 同步,需要等待返回结果。例如用户点击了注册按钮,需要等待服务端返回结果,那么需要有一个进度条来提示用户你的程序正在运行没有死掉。一般与服务端交互的都要有进度条,例如系统自带的浏览器,URL跳转时会有进度条。&
  2) 异步,不需要等待返回结果。例如微博中的收藏功能,点击完收藏按钮后是否成功执行完成后告诉我就行了,我不想等它,这里最好实现为异步的。 &
  无论同步异步,事件处理都可能比较耗时,那么需要放到其他线程中处理,等处理完成后,再通知界面刷新。 &
  这里有一点要注意,不是所有的界面刷新行为都需要放到Main线程处理,例如TextView的setText()方法需要在Main线程中,否则会抛出CalledFromWrongThreadException,而ProgressBar的setProgress()方法则不需要在Main线程中处理。&
  当然你也可以把所有UI组件相关行为都放到Main线程中处理,没有问题。可以减轻你的思考负担,但你最好了解他们之间的差别,掌握事物之间细微差别的是专家。把事件处理代码放到其他线程中处理,如果处理的结果需要刷新界面,那么需要线程间通讯的方法来实现在其他线程中发消息给Main线程处理。&
如何实现线程间通讯 &
  在Android中有多种方法可以实现其他线程与Main线程通讯,我们这里介绍常见的两种。 &
  1) 使用AsyncTask &
  AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行,对于开发者而言,它屏蔽掉了多线程和后面要讲的Handler的概念。你不了解怎么处理线程间通讯也没有关系,AsyncTask体贴的帮你做好了。使用他你会发现你的代码很容易被理解,因为他们都有一些具有特定职责的方法,尤其是AsyncTask,有预处理的方法onPreExecute,有后台执行任务的方法doInBackground,有更新进度的方法publishProgress,有返回结果的方法onPostExecute等等,这就不像post这些方法,把所有的操作都写在一个Runnable里。不过封装越好越高级的API,对初级程序员反而越不利,就是你不了解它的原理。当你需要面对更加复杂的情况,而高级API无法完成得很好时,你就杯具了。所以,我们也要掌握功能更强大,更自由的与Main线程通讯的方法:Handler的使用。&
  2) 使用Handler &
  这里需要了解Android SDK提供的几个线程间通讯的类。 &
  2.1 Handler &
  Handler在android里负责发送和处理消息,通过它可以实现其他线程与Main线程之间的消息通讯。 &
  2.2 Looper &
  Looper负责管理线程的消息队列和消息循环 &
  2.3 Message &
  Message是线程间通讯的消息载体。两个码头之间运输货物,Message充当集装箱的功能,里面可以存放任何你想要传递的消息。 &
  2.4 MessageQueue &
  MessageQueue是消息队列,先进先出,它的作用是保存有待线程处理的消息。 &
  它们四者之间的关系是,在其他线程中调用Handler.sendMsg()方法(参数是Message对象),将需要Main线程处理的事件添加到Main线程的MessageQueue中,Main线程通过MainLooper从消息队列中取出Handler发过来的这个消息时,会回调Handler的handlerMessage()方法。&
  除了以上两种常用方法之外,还有几种比较简单的方法 &
  3) Activity.runOnUiThread(Runnable) &
  4) View.post(Runnable) &
  View.postDelayed(Runnable, long) &
  5) Handler.post &
  Handler.postDelayed(Runnable, long) &
利用线程池提高性能 &
  这里我们建议使用线程池来管理临时的Thread对象,从而达到提高应用程序性能的目的。 &
  线程池是资源池在线程应用中的一个实例。了解线程池之前我们首先要了解一下资源池的概念。在JAVA中,创建和销毁对象是比较消耗资源的。我们如果在应用中需要频繁创建销毁某个类型的对象实例,这样会产生很多临时对象,当失去引用的临时对象较多时,虚拟机会进行垃圾回收(GC),CPU在进行GC时会导致应用程序的运行得不到相应,从而导致应用的响应性降低。&
  资源池就是用来解决这个问题,当你需要使用对象时,从资源池来获取,资源池负责维护对象的生命周期。 &
  了解了资源池,就很好理解线程池了,线程池就是存放对象类型都是线程的资源池。 &
  我增加了如何在其他线程中创建Handler的例子作为选学,前面都掌握好了的同学可以看一下,如果你需要实现一个跟Main线程类似的消息处理机制,需要其他线程可以跟你的线程通讯,可以通过这种方法实现。&
1、问题提出 &
1)为何需要多线程? &
2)多线程如何实现? &
3)多线程机制的核心是啥? &
4)到底有多少种实现方式? &
2、问题分析 &
1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到&很卡&。 &
eg:你点击按钮下载一首歌,接着该按钮一直处于按下状态,那么用户体验就很差。 &
2)多线程实现方式implements Runnable 或 extends Thread &
3)多线程核心机制是Handler &
4)提供如下几种实现方式 &
&&&&&&&&&&&&说明1 &
创建一个Handler时一定要关联一个Looper实例,默认构造方法Handler(),它是关联当前Thread的Looper。 &
我们在UI Thread中创建一个Handler,那么此时就关联了UI Thread的Looper! &
这一点从源码中可以看出! &
精简代码如下: &
public Handler() { &
& & & & mLooper = Looper.myLooper(); &
//当前线程的Looper,在Activity创建时,UI线程已经创建了Looper对象 &
//在Handler中机制中Looper是最为核心的,它一直处于循环读MessageQueue,有 &
//要处理的Message就将Message发送给当前的Handler实例来处理 &
& & & & if (mLooper == null) { &
& & & & & & throw new RuntimeException( &
& & & & & & & & &Can&t create handler inside thread that has not called Looper.prepare()&);&
& & & & } &
//从以上可以看出,一个Handler实例必须关联一个Looper对象,否则出错 &
& & & & mQueue = mLooper.mQ &
//Handler的MessageQueue,它是FIFO的吗?不是!我感觉应该是按时间先后排列 &
//的!Message与MessageQueue到底是啥关系?感兴趣可以研究一下源码! &
& & & & mCallback = &
在创建一个Handler的时候也可以指定Looper,此时的Looper对象,可以是当前线程的也可以是其它线程的! &
Handler只是处理它所关联的Looper中的MessageQueue中的Message,至于它哪个线程的Looper,Handler并不是很关心! &
我们在UI线程中创建了Handler实例,此时传进Worker线程的Looper,此时依然可以进行业务操作! &
--------------------创建工作者线程 &
private static final class Worker implements Runnable &
& private static final Object mLock = new Object() ; &
& private Looper mL &
& public Worker(String name) &
& &final Thread thread = new Thread(null,this,name) ; &
& &thread.setPriority(Thread.MIN_PRIORITY) ; &
& &thread.start() ; &
& &synchronized(mLock) &
& & while(mLooper == null) &
& & &try &&
& & & mLock.wait() ; &
& & &catch (InterruptedException e) &&
& & & e.printStackTrace(); &
& @Override &
& public void run() { &
& &synchronized(mLock) &
& &{ & & &
& & //该方法只能执行一次,一个Thread只能关联一个Looper &
& & & &Looper.prepare() ; &
& & & &mLooper = Looper.myLooper() ; &
& & & &mLock.notifyAll() ; &
& & &Looper.loop() ; &
& public Looper getLooper() &
& &return mL &
& public void quit() &
& & &mLooper.quit() ; &
我们可以在UI线程中创建一个Handler同时传入Worker的Looper &
----------------定义自己的Handler &
private final class MyHandler extends Handler &
& public MyHandler(Looper looper) &
& &super(looper) ; &
& @Override &
& public void handleMessage(Message msg) { &
& &switch(msg.what) &
& &case 100 : &
& & mTv.setText(&& + id) ; &
---------在Activity中创建Handler &
this.mWorker = new Worker(&workerThread&) ; &
this.mMyHandler = new MyHandler(this.mWorker.getLooper()) ; &
---------创建Message &
final Message msg = this.mMyHandler.obtainMessage(100); &
msg.put(&test& , &test&) ; &
msg.sendToTarget() ; &
需要注意的是,每一个Message都必须要有自己的Target即Handler实例! &
源码如下: &
public final Message obtainMessage(int what) &
& & & & return Message.obtain(this, what); &
public static Message obtain(Handler h, int what) { &
& & & & Message m = obtain(); &
& & & & m.target =//可以看出message关联了当前的Handler &
& & & & m.what = &
以上只是作了一点原理性的说明! &
& & 我们平时使用Handler主要是用来处理多线程的异步交互问题! &
& & 由于Android规定只有UI线程才能更新用户界面和接受用户的按钮及触摸事件! &
那么就必须保证UI线程不可以被阻塞,从而耗时操作必须要开启一个新的线程来处理! &
& & 那么问题就来了,等耗时操作结束以后,如何把最新的数据反馈给用户呢?而我们目前工作Worker线程中,从而不可以进行UI更新。 &
& & 那么怎么办呢?必须要把最新的数据传给UI线程能处理的地方!现在就派到Handler出场了!可Handler到底干了啥呢?简要说明如下: &
& &Activity所在的UI线程在创建的时候,就关联了Looper和MessageQueue,那么我们又在UI线程里创建了自己的Handler,那么Handler是属于UI线程的,从而它是可以和UI线程交互的!&
& & UI线程的Looper一直在进行Loop操作MessageQueue读取符合要求的Message给属于它的target即Handler来处理!所以啊,我们只要在Worker线程中将最新的数据放到Handler所关联的Looper的MessageQueue中,然而Looper一直在loop操作,一旦有符合要求的Message,就第一时间将Message交给该Message的target即Handler来处理!所以啊,我们在创建Message的时候就应该指定它的target即Handler!&
& 但我们也可以,new Message() -- & mHandler.sendMessage(msg) ;这是特例! &
& 如果我们通过obtainMessage()方法获取Message对象,此时Handler就会自动设置Message的target。可以看源码! &
简单一点说就是: &
UI线程或Worker线程提供MessageQueue,Handler向其中填Message,Looper从其中读Message,然后交由Message自己的target即Handler来处理!!最终被从属于UI线程的Handler的handlMessag(Message msg)方法被调用!!&
这就是Android多线程异步处理最为核心的地方!! &
有点罗嗦啊!! &
******************************************************************* &
在UI线程中创建Handler[一般继承HandleMessage(Message msg)] &
& & & & & & & & & & & & & & & & & & & & & &| &
& & & & & & & & & & & & & & & & & & & & & &| &
& & & & & & Looper可以属于UI线程或Worker线程 &
& & & & & & & & & & & & & & & & & & & & & &| &
& & & & & & & & & & & & & & & & & & & & & &| &
从属于Looper的MessgeQueue,Looper一直在loop()操作,在loop()中执行msg.target.dispatchMessage(msg);调用Handler的handleMessage(Message msg)&
& & & & & & & & & & & & & & & & & & & & & &| &
& & & & & & & & & & & & & & & & & & & & & &| &
在 Worker线程中获取Message,然后通过Handler传入MessageQueue &
******************************************************************* &
-----------------在创建一个Looper时,就创建了从属于该Looper的MessageQueue &
&private Looper() { &
& & & & mQueue = new MessageQueue(); &
& & & & mRun = &
& & & & mThread = Thread.currentThread(); &
----2-----View &
post(Runnable action) &
postDelay(Runnable action , long miliseconds) &
-----3-----Activity &
runOnUiThread(Runnable action) &
该方法实现很简单: &
public final void runOnUiThread(Runnable action) { &
& & & & &if (Thread.currentThread() != mUiThread) { &
& & & & & & &//如果当前线程不是UI线程 &
& & & & & & &mHandler.post(action); &
& & & & &} else { &
& & & & & & &action.run(); &
& & & & &} &
&mUiThread = Thread.currentThread() ; &
&mHandler = new Handler() & & &
-----4-----AsyncTask&Params,Progress,Result& &
Params,Progress,Result都是数据类型, &
Params要处理的数据的类型 &
Progress处理进度的类型 &
Result处理后返回的结果 &
它是一个异步处理的简单方法! &
方法的执行顺序: &
onPreExecute() --在UI线程中执行,作一些初始化操作 &
doInBackground(Params... params) --在Worker线程中执行,进行耗时的后台处理,在该方法中可以调用publishProgress(Progress progress) 进行进度处理&
onProgressUpdate(Progress progress) --在UI线程中执行,进行进度实时处理 &
4)onPostExecute(Result result) --在UI线程中执行, 在doInBackground(Params ... params)返回后调用&
onCancelled() --在UI线程中执行,在AsyncTask实例调用cancle(true)方法后执行,作一些清理操作 &
几点注意: &
AsyncTask必须在UI线程中创建, &
asyncTask.execute(Params... params) ;在UI线程中执行,且只能执行一次 &
要想再次调用execute(Params... params),必须重新创建AsyncTask对象 &
后3种方法本质上都是利用Handler来实现的!
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'多线程Post工具绿色版|多线程Post工具2.7 绿色免费版-东坡下载
东坡下载:内容最丰富最安全的下载站!|||
→ 多线程Post工具 2.7 绿色免费版
多线程Post工具介绍
多线程Post工具,一款超级棒的多线程post工具,能够让控件具有“记忆”功能等等哦!功能十分的强大,绿色版、完全免费哦!有需要的快来使用吧!多线程Post工具使用教程1、关于post工具2、线程3、方框里面全部设置好,点击提交即可4、如图所示代理多线程post工具更新日志使用变量中加入10/13位时间戳-------------------------------------------------------------------------------【 2:23】更新说明:加入了在线人数意见反馈检查更新(手动,非强制)修复几个小问题94个赞了谢谢大家【】2.4加入POST/GET文本识别更换了检查更新链接,因为发现添牙博客修改后更新延迟很高【 00:10】加入历史记录功能加入自定义附加标记取消显示在线人数(造成卡顿)【 20:48】多线程中加了支持“@”变量 &///@变量@时戳十@时戳三POST模式时 提交头与提交尾任意位置多个@///@变量@时戳十@时戳三GET可以在网址中任意位置多个&@&加入变量编码转换加入部份控件“记忆”功能修复打开后马上关闭的错误窗口,感谢热心朋友提醒
post工具相关软件
电脑版相关
手机版相关
多线程Post工具 2.7 绿色免费版
33M / 05-17 / v2.0 官方免费个人版
1.1M / 06-03 / 1.5.1510 免费安装版
369KB / 03-27 / V1.2 免费版
7.0M / 09-18 / 5.75 官方免费版
1.8M / 06-24 / 4.8
本类软件排行
装机必备软件
压缩阅读卸载恢复2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 易语言多线程post登录 的文章

 

随机推荐