Android后台进程与UI进程的交互

来源:互联网 发布:缠论均线指标公式源码 编辑:程序博客网 时间:2024/06/03 05:18

当一个程序第一次启动时,Android会同时启动一个对应的主线程(MainThread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。 

比如说从网上获取一个图片,在一个ImageView中将其显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得图片后,是不能直接在网络操作线程中调用ImageView的相关方法的,因为其他线程中是不能直接访问主UI线程成员。

完整代码:

注意的是:Manifest.xml文件中,要声明网络权限


001 package com.xsjayz.thread;
002 
003importorg.apache.http.HttpResponse;
004importorg.apache.http.client.HttpClient;
005importorg.apache.http.client.methods.HttpGet;
006importorg.apache.http.impl.client.DefaultHttpClient;
007 
008importandroid.app.Activity;
009importandroid.graphics.Bitmap;
010importandroid.graphics.BitmapFactory;
011importandroid.os.Bundle;
012importandroid.os.Handler;
013importandroid.os.Message;
014importandroid.view.View;
015importandroid.view.View.OnClickListener;
016importandroid.widget.Button;
017importandroid.widget.ImageView;
018importandroid.widget.Toast;
019 
020
026publicclass ThreadHandlerActivity extends Activity {
027 
028    privatestatic final intMSG_SUCCESS = 0;// 获取图片成功的标识
029    privatestatic final intMSG_FAILURE = 1;// 获取图片失败的标识
030 
031    privateImageView mImageView;
032    privateButton mButton;
033    privateThread mThread;
034 
035    @Override
036    publicvoid onCreate(Bundle savedInstanceState) {
037        super.onCreate(savedInstanceState);
038        setContentView(R.layout.main);
039 
040        mImageView= (ImageView) findViewById(R.id.imageView);
041        mButton= (Button) findViewById(R.id.button);
042 
043        mButton.setOnClickListener(newOnClickListener() {
044            @Override
045            publicvoid onClick(Viewv) {
046                //如果线程还没启动,则启动新的线程
047                if(mThread == null) {
048                    mThread= new Thread(runnable);
049                    mThread.start();
050 
051                    //否则提示:"线程已经启动"
052                }else {
053                    Toast.makeText(
054                            getApplication(),
055                            getApplication().getString(R.string.thread_started),
056                            Toast.LENGTH_LONG).show();
057                }
058            }
059        });
060    }
061 
062    privateHandler mHandler = new Handler() {
063        //重写handleMessage()方法,此方法在UI线程运行
064        @Override
065        publicvoid handleMessage(Message msg) {
066            switch(msg.what) {
067            //如果成功,则显示从网络获取到的图片
068            caseMSG_SUCCESS:
069                mImageView.setImageBitmap((Bitmap)msg.obj);
070                Toast.makeText(getApplication(),
071                        getApplication().getString(R.string.get_pic_success),
072                        Toast.LENGTH_LONG).show();
073                break;
074            //否则提示失败
075            caseMSG_FAILURE:
076                Toast.makeText(getApplication(),
077                        getApplication().getString(R.string.get_pic_failure),
078                        Toast.LENGTH_LONG).show();
079                break;
080            }
081        }
082    };
083 
084    Runnablerunnable = new Runnable() {
085        //重写run()方法,此方法在新的线程中运行
086        @Override
087        publicvoid run(){
088            HttpClienthttpClient = new DefaultHttpClient();
089            //从网络上获取图片
090            HttpGethttpGet = new HttpGet(
091                    "http://www.oschina.net/img/logo.gif");
092            finalBitmap bitmap;
093            try{
094                HttpResponsehttpResponse = httpClient.execute(httpGet);
095                //解析为图片
096                bitmap= BitmapFactory.decodeStream(httpResponse.getEntity()
097                        .getContent());
098            }catch (Exceptione) {
099                mHandler.obtainMessage(MSG_FAILURE).sendToTarget();//获取图片失败
100                return;
101            }
102 
103            //获取图片成功,向UI线程发送MSG_SUCCESS标识和bitmap对象
104            mHandler.obtainMessage(MSG_SUCCESS,bitmap).sendToTarget();
105        }
106    };
107 
108}

0 0
原创粉丝点击