小说招代理 更新多种文 支付宝电费每天更新吗

6.16 | 高安掌圈:网罗高安各种信息…每日更新招聘、求职、转让、出租等便民消息
《掌圈》里有房屋租售、招聘、顺风车、微商...
只要您有需求都可以通过掌圈来发布
《高安在线》将和广大的粉丝一起
把掌圈打造为高安
最大!最全面!最方便
的便民信息圈
入驻热线:1(微信同号)
【旭辉实业有限公司】
【旭辉实业有限公司】因发展需要现诚聘以下职位:
一、店长2名(家庭装修:集成墙面,集成吊顶,铝门窗)
1、岗位要求:高中以上学历、女性、形象上佳、表达能力强、有相同岗位两年以上工作经验者优先录用;
2、具有良好的执行和沟通能力、以及带领团队攀登销售高峰的精神;
3、年龄28~40岁,有经验或意向强烈者可酌情放宽标准。
4、薪资待遇:保底工资元/月。(底薪+提成+绩效考核工资+全勤奖+年终分红)
二、销售顾问10名(家庭装修:集成墙面,集成吊顶,铝门窗)
1、岗位要求,初中以上学历,形象上佳、表达能力强、有家装,建材行业销售经验者优先录用;
2、工作细致、责任感强、有良好的沟通能力以及团队精神;
3、年龄20~40岁,有地板、硅藻泥、墙布、皮雕、防盗门、铝合金门窗销售经验或意向强烈者可酌情放宽标准;
4、薪资待遇:保底工资元/月。
三、设计师2名(家庭装修:集成墙面,集成吊顶,铝门窗)
1、岗位要求,中专以上学历、男女不限,懂CAD、PS、略懂园方软件;
2、薪资待遇:底薪+提成+绩效考核工资+全勤奖+年终分红。
四、文员1名(家庭装修:集成墙面,集成吊顶,铝门窗)
岗位要求:中专以上学历,女性,熟悉电脑办公软件操作,形象上佳,薪资待遇:元/月+全勤奖。
五、服装导购专员2名(傲丝度品牌女装专卖店)
1、高中以上学历,形象上佳、表达能力强、有服装行业2年以上销售经验者优先录用;
2、工作细致、责任感强、有良好的沟通能力以及团队精神;
3、薪资待遇:底薪+提成+全勤奖。
六、竹木装饰板集成吊顶/墙面安装师傅5名
岗位要求:能全盘操作竹木装饰板集成吊顶/墙面安装过程以及良好的服务意识。
七、工程监理(家庭装修:集成墙面,集成吊顶,铝门窗)
1、岗位要求,年龄25~45岁,高中以上学历,表达能力强、有家装管理经验2年以上优先录用;
2、工作细致、责任感强、有良好的沟通能力以及团队精神;
3、薪资待遇:保底工资+分红。
地址:高安市瑞阳大道世博华城斜对面老赖不赖门窗
招聘热线 :江先生 或徐女士
【高安在线招聘】
高安在线因业务发展需要,现需诚聘以下人员加入团队:
① 项目经理: 要求有销售和团队管理经验,年龄25岁以上;
② 营销顾问: 有良好的沟通交流能力,有耐心,从事过互联网行业更佳;
③ 前台售后: 形象好,做事仔细认真,从事过出纳会计者优先考虑;
④活动执行人员:有活动策划经验者优先
以上岗位待遇丰厚,有才你就来,优秀舞台造就精英人才!
诚聘热线:(微信同号)
【永乐滋百货招聘】
永乐滋百货超市急招收银员两名,女性、年龄20--35岁、责任心强、会简单电脑操作,待遇面议
联系人:王先生
【高安新生代企业家商会招聘】
高安新生代企业家商会招聘专职文员:上班时间早上8:00到下午5:00,
要求,女.35岁以下,大专文凭。懂电脑。待遇优,
联系电话:
【江西吉祥云智能家居招聘】
经营范围:智能家居工程设及施工、家庭影院设计及施工、安防监控设计及施工、移动宽带办理及无线信号覆盖、通信工程设计及安装
现诚聘以下人才:业务经理1名,业务人员若干名,弱点工程是若干名,兼职业务人员若干名,暑假工若干:无需任何经验,可边工作边学习
联系电话:(微信同步)
地址:安居小区前门路3号1楼扬子智能家居体验店
【招聘公交驾驶员】
招聘对象:A1/A3驾驶员,应聘的驾驶员要有热爱城市公交的事业心,有强烈的安全意识,有对工作认真负责的品德,有意应聘者,持相关的驾驶证和其他证件复印件到公交公司报名
招聘合格者的福利待遇,月薪4800元(含社保、医保等),另附带假日福利补贴,寒暑假季补贴。延时加班补贴,满勤奖励补贴,安全奖励补贴,文明驾驶补贴,星级服务补贴,年薪超过六万元。每月休假两天,每月安全例会公司提供酒店晚餐。
合格应聘录用者,签订聘用合同,付驾驶押金1万元,每月工资不延迟,不扣押,按月照发。欢迎应聘,未尽事宜到公司了解。
报名电话:(黄)
【安居果篮子】
安居果篮子招4四名导购,男女不限,2000?提成?全勤,要求40岁以下,性格开朗,沟通能力强
联系人:冷
【欧亿水上大世界】
招聘:王牌营销
欧亿健身管理有限公司,启动王牌营销计划。特此诚聘各路精英加盟!
要求:男女不限,年龄22以上,未婚,大专学历以上,善沟通,大方,够自信!薪资1980+奖金+全勤+提成=5000起
联系电话:,张
美容院信息
本人想在高安市内求租一家中小型美容院店面,或者并购美容院
联系电话:雷、李
诚招各乡镇有意向开美容连锁分店的合作伙伴,合作要求:有梦想有人脉关系既可(现有的分店:高安、八景、新街、独城、董家)
联系电话:雷、李
家庭主妇热爱美容行业的自由职业者,美容师若干名,美容学徒若干名,工资面议 联系电话:雷、李
【鑫至尊牛排】
鑫至尊牛排高安鹏泰百货四楼诚聘
服务员10名、吧员5名、传菜生5名、店长1名、领班2名、收银员2名,工资面谈
联系电话:
【招聘美容师】
招2名美容师,不需要任何技术,我们送去培训,培训期间有工资。要求:38岁以下,女性,性格开朗。
联系电话: 卢文
【新街鑫鼎陶瓷招聘】
现招瓦片捡砖工5名工资3800(12小时),试用期一个星期。
瓦片打包工4名工资4700(12小时)60岁以下男女都可以做。包吃包住
联系人李生,《微信同号》
何生.《微信同号》
工作地点江西.高安,新街.鑫鼎陶瓷【自己有事的可以给父母找份工作】
招聘求职(更新 4 条)
▼【招聘】招聘:武术散打教练,跆拳道教练多名,工资面议(联系电话:)
▼【招聘】本人男:29岁,大学本科毕业,从事教学行业已有6个年头,一直任教音乐课教学,在这方面还精通各种乐器 声乐,钢琴 葫芦丝 萨克斯 西洋管乐器等,暑假即将来临,我准备开设一个兴趣班,各位亲爱的家长,想让自己的小孩有一技之长,改掉整天沉迷于网络游戏中的坏习惯,安全度过漫长的暑期,赶紧来微我吧。(联系电话:)
▼【求职】本人现大二,女生,18号放假,求一份兼职,需包吃包住,谢谢!(联系电话:)
▼【招聘】招聘业务员.工资只要你敢想敢要.我就为你提供平台。底薪十提成或股份(联系电话:)
本地服务(更新 1 条)
▼暑假报名开始了,凡在7月10之前报名的学员,暑假优惠200元,全年报名优惠500元,现预交100元抵200元,团队报名更是优惠多多,武术散打、拳击、女子防身术、综合格斗、跆拳道,年满4岁以上均可报名,男女不限,学真正的功夫就找德胜武术馆,宜春十运会,我武馆代表高安市体育局出赛,高安市唯一一家武馆出场,散打搏击,让我们7月12一15日,宜春市体育馆,散打擂台上相见。(联系电话:)
房屋租售(更新 3 条)
▼高安市筠泉路商业街黄金地段旺铺招租!适合经营家电,手机城,餐饮,服装,黄金等等。无转让费!总面积1300平米左右。(联系电话:)
▼【求租】本人想求租一室一厅或者两室一厅的房子最好是拎包入住的 欢迎打扰(联系电话:)
▼【求售】本人想在北街求购一套三室二厅带地下室车库的毛坯房(联系电话:)
优惠信息(更新 1 条)
▼暑期热招4一18岁7月5日前报名暑期卡减200元,年卡减500元送价值198元练功服一套,武术散打、跆拳道、拳击、女子防身术、综合格斗丶老生家长凡在7月10日前连续五天转发并附带文字到朋友圈,积满50(联系电话:)
免责声明:
以上信息是由本地掌圈平台用户自行发布,所有内容均由发布者对信息的真实性负责,掌圈平台及本公众号平台仅提供信息发布、展示,不对用户信息内容的真实性负责。
被脚气困扰的朋友一定不能错过,现有一款霸气根治脚气的产品,让你彻底解决脚气带给你的困扰…高安在线步生花项目团队带领你走上成功的道路…
欢迎更多有意兼职的朋友联系我们的团队人员
汪 昱:(微信同步)
江丽娟:(微信同步)
丁 俊 :(微信同步)
王社员:(微信同步)
熊丹莲:(微信同步)
傅 勇:(微信同步)
文海平:(微信同步)
小 魏:(微信同步)
彭增荣:(微信同步)
八景、独城、新街
唐翠翠:(微信tt10255)
李志刚:(微信同步)
各乡镇代理招商财富热线:(文)(彭)
张志香:(微信同步)
加拿大代理
全球各地市场详询财富热线:(文)(彭)
戳这里戳这里进入高安掌圈~~
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点&&&&& 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来。这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽。我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找。
&&&& 这就是项目进度没有规划好而导致的。
&&&& 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了,导致我的进度严重被打乱!而且更加可怕的是,就算我手机这边调试完毕,我最终的目标是实现手机与蓝牙模块的通信,那个测试板至今未送过来,所以,我开始消极怠工了。
&&&&&经验教训非常简单:根据整个项目的时间长度规划好每天的进度,视实际情况的变化而改变规划,就算真的是无法开展工作,像是现在这样抽空出来写写博客都要好过无意义的敲代码。
&&&& 今天讲的内容非常简单,只是讲讲有关于android界面更新的方面。
1.利用Looper更新UI界面
&&&& 如果我们的代码需要随时将处理后的数据交给UI更新,那么我们想到的方法就是另开一个线程更新数据(也必须这么做,如果我们的数据更新运算量较大,就会阻塞UI线程),也就是界面更新和数据更新是在不同线程中(android采用的是UI单线程模型,所以我们也只能在主线程中对UI进行操作),但这会导致另一个问题:如何在两个线程间通信呢?android提供了Handler机制来保证这种通信。
&&&& 先是一个简单的例子:
public class MainActivity extends Activity {
private Button mB
private TextView mT
@SuppressLint("HandlerLeak")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)this.findViewById(R.id.button);
mText = (TextView)this.findViewById(R.id.text);
final Handler handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
mText.setText("更新后");
mText.setText("更新前");
final Thread thread = new Thread(new Runnable(){
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
thread.start();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
&&&&&&在Main主线程中新开一个线程,该线程负责数据的更新,然后将更新后的数据放在Message里面,然后通过Handler传递给相应的UI进行更新。
&&&&& 使用TextView或者其他组件的时候,如果出现这样的错误:
&&&&& android.content.res.Resources$NotFoundException:String resource ID #0x86
&&&&& 这样的错误误导性真大!我以为是我的资源ID用错了,但就是这个ID,一下子就没法子了,查了很久,结果发现是TextView.setText()要求的是字符串,但我传入了一个int!就这个问题,原本是传参错误,但android竟然没有报错,而且这个错误提示也太那个了吧!!
&&&&& Message的任务很简单,就是用来传递数据更新信息,但有几点也是值得注意的:我们可以使用构造方法来创建Message,但出于节省内存资源的考量,我们应该使用Message.obtain()从消息池中获得空消息对象,而且如果Message只是携带简单的int信息,优先使用Message.arg1和Message.arg2来传递信息,这样比起使用Bundle更省内存,而Message.what用于标识信息的类型。
&&&&& 我们现在来了解Handler的工作机制。
&&&&& Handler的作用就是两个:在新启动的线程中发送消息和在主线程中获取和处理消息。像是上面例子中的Handler就包含了这两个方面:我们在新启动的线程thread中调用Handler的sendMessage()方法来发送消息。发送给谁呢?从代码中可以看到,就发送给主线程创建的Handler中的handleMessage()方法处理。这就是回调的方式:我们只要在创建Handler的时候覆写handleMessage()方法,然后在新启动的线程发送消息时自动调用该方法。
&&&&& 要想真正明白Handler的工作机制,我们就要知道Looper,Message和MessageQueue。
&&&&& Looper正如字面上的意思,就是一个"循环者",它的主要作用就是使我们的一个普通线程变成一个循环线程。如果我们想要得到一个循环线程,我们必须要这样:
class LooperThread extends Thread{
public Handler mH
public void run(){
Looper.prepare();
mHandler = new Handler(){
public void handleMessage(Message msg){
//process incoming message here
Looper.loop();
&&&&& Looper.prepare()就是用来使当前的线程变成一个LooperThread,然后我们在这个线程中用Handler来处理消息队列中的消息,接着利用Looper.loop()来遍历消息队列中的所有消息。
&&&&& 话是这么说,但是最后处理的是消息队列中的最后一个消息:
mHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
mTextView.setText(msg.what + "");
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
LooperThread thread = new LooperThread();
thread.setHandler(mHandler);
thread.start();
class LooperThread extends Thread {
public void setHandler(Handler handler){
this.handler =
public void run() {
Looper.prepare();
for (int i = 0; i & 10; i++) {
Message message = Message.obtain();
message.arg1 =
handler.sendMessage(message);
Looper.loop();
&&&&&&结果显示的是9!!难道说MessageQueue是"先进后出"的队列?
&&&&& 这只是因为处理得太快,如果我们这样子:
Thread.sleep(1000);
handler.sendMessage(message);
}catch(InterruptedException e){}
&&&&&& 我们就可以看到TextView从0一直数到9。
&&&&&& 由此可知道,sendMessage()方法的实现是回调了handleMessage(),所以说是处理消息队列中的所有消息也是正确的,因为消息一发送到消息队列中就立即被处理。
&&&&& &Looper线程应该怎么使用,得到一个Looper引用我们能干嘛?
&&&&& 让我们继续思考这个问题。
&&&&& 每个线程最多只有一个Looper对象,它的本质是一个ThreadLocal,而ThreadLocal是在JDK1.2中引入的,它为解决多线程程序的并发问题提供了一种新思路。
&&&&& ThreadLocal并不是一个Thread,它是Thread的局部变量,正确的命名应该是ThreadLocalVariable才对。如果是经常看android源码的同学,有时候也会发现它的一些变量的命名也很随便。
&&&&& ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本而不会影响到其他线程的副本。这种解决方案就是为每一个线程提供独立的副本,而不是同步该变量。
&&&&& 但是该变量并不是在线程中声明的,它是该线程使用的变量,因为对于线程来说,它所使用的变量就是它的本地变量,所以Local就是取该意。
&&&&&&学过java的同学都知道,编写线程局部变量比起同步该变量来说,实在是太笨拙了,所以我们更多使用同步的方式,而且java对该方式也提供了非常便利的支持。
&&&&& 现在最大的问题就是:ThreadLocal是如何维护该变量的副本呢?
&&&&& 实现的方式非常简单:在ThreadLocal中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应的是该线程的变量副本。
&&&&& 同样是为了解决多线程中相同变量的访问冲突问题,ThreadLocal和同步机制相比,有什么优势呢?
&&&&& 使用同步机制,我们必须通过对象的锁机制保证同一时间只有一个线程访问变量。所以,我们必须分析什么时候对该变量进行读写,什么时候需要锁定某个对象,又是什么时候该释放对象锁等问题,更糟糕的是,我们根本就无法保证这样做事万无一失的。
&&&&& ThreadLocal是通过为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突,所以我们也就没有必要使用对象锁这种难用的东西,这种方式更加安全。
&&&&& ThreadLocal最大的问题就是它需要为每个线程维护一个副本,也就是"以空间换时间"的方式。我们知道,内存空间是非常宝贵的资源,这也是我们大部分时候都不会考虑该方式的原因。
&&&&&为什么Looper是一个ThreadLocal呢?Looper本身最大的意义就是它内部有一个消息队列,而其他线程是可以向该消息队列中添加消息的,所以Looper本身就是一个ThreadLocal,每个线程都维护一个副本,添加到消息队列中的消息都会被处理掉。
mHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1){
mTextView.setText(msg.what + "");
Toast.makeText(MainActivity.this, msg.what + "", Toast.LENGTH_LONG).show();
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Thread1 thread1 = new Thread1();
thread1.setHandler(mHandler);
thread1.start();
Thread2 thread2 = new Thread2();
thread2.setHandler(mHandler);
thread2.start();
Thread2 extends Thread {
public void setHandler(Handler handler){
this.handler =
public void run() {
Message message = Message.obtain();
message.what = 2;
handler.sendMessage(message);
Thread1 extends Thread {
public void setHandler(Handler handler){
this.handler =
public void run() {
Message message = Message.obtain();
message.what = 1;
handler.sendMessage(message);
&&&&& 上面这段代码是新建两个线程,每个线程都维护一个Handler,然后都向这个Handler发送消息,结果就是这两个消息同时被处理。&&&& &Hanlder本身就持有一个MessageQueue和Looper的引用,默认情况下是创建该Handler的线程的Looper和该Looper的MessageQueue。
&&&&& Hanler只能处理由自己发出的消息,它会通知MessageQueue,表明它要执行一个任务,然后在轮到自己的时候执行该任务,这个过程是异步的,因为它不是采用同步Looper的方式而是采用维护副本的方式解决多线程共享的问题。
&&&&& 一个线程可以有多个Handler,但是只能有一个Looper,理由同上:维护同一个Looper的副本。
&&&&& 到了这里,我们可以发现:新开一个线程用于处理数据的更新,在主线程中更新UI,这种方式是非常自然的,而且这也是所谓的观察者模式的使用(使用回调的方式来更新UI,几乎可以认为是使用了观察者模式)。
&&&&&&我们继续就着Looper探讨下去。
&&&&& 因为Handler需要当前线程的MessageQueue,所以我们必须通过Looper.prepare()来为Handler启动MessageQueue,而主线程默认是有MessageQueue,所以我们不需要在主线程中调用prepare()方法。在Looper.loop()后面的代码是不会被执行的,除非我们显式的调用Handler.getLooper().quit()方法来离开MessageQueue。
&&&&& 到了这里,我们之前的问题:LooperThread应该如何使用?已经有了很好的答案了: LooperThread用于UI的更新,而其他线程向其Handler发送消息以更新数据。因为主线程原本就是一个LooperThread,所以我们平时的习惯都是在主线程里创建Handler,然后再在其他线程里更新数据,这种做法也是非常保险的,因为UI组件只能在主线程里面更新。
&&&&& 当然,Handler并不仅仅是用于处理UI的更新,它本身的真正意义就是实现线程间的通信:
new LooperThread().start();
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
final int MESSAGE_HELLO = 0;
String message = "hello";
mHandler.obtainMessage(MESSAGE_HELLO, message).sendToTarget();
class LooperThread extends Thread {
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_HELLO:
Toast.makeText(MainActivity.this, (String) msg.obj,
Toast.LENGTH_SHORT).show();
Looper.loop();
&&&&&&上面是Handler非常经典的用法:我们通过Handler的obtainMessage()方法来创建一个新的Message(int what, Object obj),然后通过sendToTarget()发送到创建该Handler的线程中。如果大家做过类似蓝牙编程这样需要通过socket通信的项目,就会清楚的知道,判断socket的状态是多么重要,而Message的what就是用来存储这些状态值(通常这些状态值是final int),值得注意的是,obj是Object,所以我们需要强制转型。但这样的编码会让我们的代码拥有一大堆常量值,而且switch的使用是不可避免的,如果状态值很多,那这个switch就真的是太臃肿了,就连android的蓝牙官方实例也无法避免这点。
&&&&& 总结一下:Android使用消息机制实现线程间的通信,线程通过Looper建立自己的消息循环,MessageQueue是FIFO的消息队列,Looper负责从MessageQueue中取出消息,并且分发到引用该Looper的Handler对象,该Handler对象持有线程的局部变量Looper,并且封装了发送消息和处理消息的接口。
&&&&& 如果Handler仅仅是用来处理UI的更新,还可以有另一种使用方式:
mHandler = new Handler();
mRunnable = new Runnable() {
public void run() {
mTextView.setText("haha");
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new Thread() {
public void run() {
mHandler.post(mRunnable);
}.start();
&&&&& 使用Handler的post()方法就显得UI的更新处理非常简单:在一个Runnable对象中更新UI,然后在另一个线程中通过Handler的post()执行该更新动作。值得注意的是,我们就算不用新开一个新线程照样可以更新UI,因为UI的更新线程就是Handler的创建线程---主线程。
&&&&&&表面上Handler似乎可以发送两种消息:Runnable对象和Message对象,实际上Runnable对象会被封装成Message对象。
2.AsyncTask利用线程任务异步更新UI界面
&&&&& AsyncTask的原理和Handler很接近,都是通过往主线程发送消息来更新主线程的UI,这种方式是异步的,所以就叫AsyncTask。使用AsyncTask的场合像是下载文件这种会严重阻塞主线程的任务就必须放在异步线程里面:
public class MainActivity extends Activity {
private Button mB
private ImageView mImageV
private ProgressBar mProgressB
@SuppressLint("HandlerLeak")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) this.findViewById(R.id.button);
mImageView = (ImageView) this.findViewById(R.id.image);
mProgressBar = (ProgressBar) this.findViewById(R.id.progressBar);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
AsyncTaskThread thread = new AsyncTaskThread();
thread.execute("http://g.search2.alicdn.com/img/bao/uploaded/i4/"
+ "i4/53897/T1dahpFapbXXXXXXXX_!!0-item_pic.jpg_210x210.jpg");
class AsyncTaskThread extends AsyncTask&String, Integer, Bitmap& {
protected Bitmap doInBackground(String... params) {
publishProgress(0);
HttpClient client = new DefaultHttpClient();
publishProgress(30);
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
bitmap = BitmapFactory.decodeStream(response.getEntity()
.getContent());
} catch (Exception e) {
return null;
publishProgress(100);
protected void onProgressUpdate(Integer... progress) {
mProgressBar.setProgress(progress[0]);
protected void onPostExecute(Bitmap result) {
if (result != null) {
Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG)
mImageView.setImageBitmap(result);
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG)
protected void onPreExecute() {
mImageView.setImageBitmap(null);
mProgressBar.setProgress(0);
protected void onCancelled() {
mProgressBar.setProgress(0);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
&&&&&实际的效果如图:
&&&&& 当我们点击下载按钮的时候,就会启动下载图片的线程,主线程这里显示下载进度条,然后在下载成功的时候就会显示图片,这时我们再点击按钮的时候就会清空图片,进度条也重新清零。
&&&& &仔细看上面的代码,我们会发现很多有趣的东西。
&&& & AsyncTask是为了方便编写后台线程与UI线程交互的辅助类,它的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后通过向UI线程的Handler传递消息的方式调用相应的回调方法实现UI界面的更新。
&&&&&AsyncTask的构造方法有三个模板参数:Params(传递给后台任务的参数类型),Progress(后台计算执行过程中,进度单位(progress units)的类型,也就是后台程序已经执行了百分之几)和Result(后台执行返回的结果的类型)。
protected Bitmap doInBackground(String... params) {
publishProgress(0);
HttpClient client = new DefaultHttpClient();
publishProgress(30);
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
bitmap = BitmapFactory.decodeStream(response.getEntity()
.getContent());
} catch (Exception e) {
return null;
publishProgress(100);
&&&&&& params是一个可变参数列表,publishProgress()中的参数就是Progress,同样是一个可变参数列表,它用于向UI线程提交后台的进度,这里我们一开始设置为0,然后在30%的时候开始获取图片,一旦获取成功,就设置为100%。中间的代码用于下载和获取网上的图片资源。
protected void onProgressUpdate(Integer... progress) {
mProgressBar.setProgress(progress[0]);
&&&&&&onProgressUpdate()方法用于更新进度条的进度。
protected void onPostExecute(Bitmap result) {
if (result != null) {
Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG).show();
mImageView.setImageBitmap(result);
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show();
&&&&&onPostExecute()方法用于处理Result的显示,也就是UI的更新。
protected void onPreExecute() {
mImageView.setImageBitmap(null);
mProgressBar.setProgress(0);
protected void onCancelled() {
mProgressBar.setProgress(0);
&&&&& 这两个方法主要用于在执行前和执行后清空图片和进度。&&&&& 最后我们只需要调用AsyncTask的execute()方法并将Params参数传递进来进行。完整的流程是这样的:
&&&&& UI线程执行onPreExecute()方法把ImageView的图片和ProgressBar的进度清空,然后后台线程执行doInBackground()方法,千万不要在这个方法里面更新UI,因为此时是在另一条线程上,在使用publishProgress()方法的时候会调用onProgressUpdate()方法更新进度条,最后返回result---Bitmap,当后台任务执行完成后,会调用onPostExecute()方法来更新ImageView。
&&&&& AsyncTask本质上是一个静态的线程池,由它派生出来的子类可以实现不同的异步任务,但这些任务都是提交到该静态线程池中执行,执行的时候通过调用doInBackground()方法执行异步任务,期间会通过Handler将相关的信息发送到UI线程中,但神奇的是,并不是调用UI线程中的回调方法,而是AsyncTask本身就有一个Handler的子类InternalHandler会响应这些消息并调用AsyncTask中相应的回调方法。从上面的代码中我们也可以看到,UI的ProgressBar的更新是在AsyncTask的onProgressUpdate(),而ImageView是在onPostExecute()方法里。这是因为InternalHandler其实是在UI线程里面创建的,所以它能够调用相应的回调方法来更新UI。
&&&& &AsyncTask就是专门用来处理后台任务的,而且它针对后台任务的五种状态提供了五个相应的回调接口,使得我们处理后台任务变得非常方便。
&&&&& 如果只是普通的UI更新操作,像是不断更新TextView这种动态的操作,可以使用Handler,但如果是涉及到后台操作,像是下载任务,然后根据后台任务的进展来更新UI,就得使用AsyncTask,但如果前者我们就使用AsyncTask,那真的是太大材小用了!!
&&&&& 要想真正理解好AsyncTask,首先就要理解很多并发知识,像是静态线程池这些难以理解的概念是必不可少的,作为新手,其实没有必要在实现细节上过分追究,否则很容易陷入细节的泥潭中,我们先要明白它是怎么用的,等用得多了,就会开始思考为什么它能这么用,接着就是怎么才能用得更好,这都是一个自然的学习过程,谁也无法越过,什么阶段就做什么事。因此,关于AsyncTask的讨论我就先放到一边,接下来的东西我也根本理解不了,又怎能讲好呢?
3.利用Runnable更新UI界面
&&&&& 剩下的方法都是围绕着Runnable对象来更新UI。
&&&&& 一些组件本身就有提供方法来更新自己,像是ProgressBar本身就有一个post()方法,只要我们传进一个Runnable对象,就能更新它的进度。只要是继承自View的组件,都可以利用post()方法,而且我们还可以使用postDelay()方法来延迟执行该Runnable对象。android的这种做法就真的是让人称道了,至少我不用为了一个ProgressBar的进度更新就写出一大堆难懂的代码出来。
&&&&& 还有另一种利用Runnable的方式:Activity.runOnUiThread()方法。这名字实在是太直白了!!使用该方法需要新启一个线程:
class ProgressThread extends Thread {
public void run() {
super.run();
while (mProgress &= 100) {
runOnUiThread(new Runnable() {
public void run() {
mProgressBar.setProgress(mProgress);
mProgress++;
Thread.sleep(100);
} catch (InterruptedException e) {
&&&& 上面提供了三种思路来解决UI更新的问题,有些地方的讨论已经严重脱离标题,那也是没有办法,因为要说明一些概念,就必须涉及到并发的其他相关知识。方法很多,但它们都有自己适合的场合:
1.如果只是单纯的想要更新UI而不涉及到多线程的话,使用View.post()就可以了;
2.需要另开线程处理数据以免阻塞UI线程,像是IO操作或者是循环,可以使用Activity.runOnUiThread();
3.如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,就需要使用Handler + Thread的方式;
4.如果是后台任务,像是下载任务等,就需要使用AsyncTask。&&&&&本来只是因为蓝牙项目而开始这篇博客,但没想到在写的过程发现越来越多的东西,于是也一起写上来了,写得不好是一定的,因为是大三菜鸟,正在拼命增强自己薄弱的编程基础中,如果错误的地方,还希望能够指点迷津。
阅读(...) 评论()

我要回帖

更多关于 昆明超市转让每天更新 的文章

 

随机推荐