您的位置:首页 > 移动开发 > Android开发

Android笔记(十五)Handler初步

2015-09-02 10:24 531 查看
当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程), 如果需要进行一个耗时的操作,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中。而Handler与子线程可以通Message对象来传递数据, 把这些消息放入主线程队列中,配合主线程进行更新UI。

简单来说,当你打开一个应用,需要下载一个图片,那么你就要把这个任务放到子线程中,然后子线程下载的图片通过Message传给Handler,这时主线程中的其它任务照常进行,Handler接收到图片以后,在把图片放到主线程,进行UI的更新。

1.建立布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载图片" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</LinearLayout>


2.AndroidManifest.xml获得权限

3.MainActivity

public class MainActivity extends ActionBarActivity {

    private Button button;
    private ImageView image;
    private final int IS_FINISH = 1;// 判断图片是否下载完成
    private ProgressDialog dialog = null;
    private String image_path = "http://img1.3lian.com/img2008/06/019/13.jpg";
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            byte[] data = (byte[]) msg.obj;
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            image.setImageBitmap(bitmap);
            if (msg.what == IS_FINISH) {
                dialog.dismiss();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        image = (ImageView) findViewById(R.id.image);
        dialog = new ProgressDialog(this);
        dialog.setTitle("提示");
        dialog.setMessage("正在下载,请稍候...");
        dialog.setCancelable(false);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 子线程开始下载图片任务
                new Thread(new MyThread()).start();
                // 显示dialog,当Handler更新完UI以后,dialog消失
                dialog.show();//线程应该是并发进行,子线程并不影响主线程
            }
        });
    }

    public class MyThread implements Runnable {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(image_path);
            HttpResponse httpResponse = null;
            try {
                httpResponse = httpClient.execute(httpGet);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    byte[] data = EntityUtils.toByteArray(httpResponse
                            .getEntity());
                    //通过obtain得到msg,msg在一个消息池当中,如果消息池不为空,可以直接得到不用new节省内存
                    Message msg = Message.obtain();
                    msg.obj = data;
                    msg.what = IS_FINISH;
                    handler.sendMessage(msg);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    }


4.效果如图所示



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: