Android笔记(十五)Handler初步
2015-09-02 10:24
531 查看
当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程), 如果需要进行一个耗时的操作,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中。而Handler与子线程可以通Message对象来传递数据, 把这些消息放入主线程队列中,配合主线程进行更新UI。
简单来说,当你打开一个应用,需要下载一个图片,那么你就要把这个任务放到子线程中,然后子线程下载的图片通过Message传给Handler,这时主线程中的其它任务照常进行,Handler接收到图片以后,在把图片放到主线程,进行UI的更新。
1.建立布局
2.AndroidManifest.xml获得权限
3.MainActivity
4.效果如图所示
简单来说,当你打开一个应用,需要下载一个图片,那么你就要把这个任务放到子线程中,然后子线程下载的图片通过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.效果如图所示
相关文章推荐
- android 学习 数据存储
- 彻底解决Android 应用方法数不能超过65K的问题
- Android studio
- Android 编程权威指南 阅读笔记
- Android Tween Animation
- android_文件下载
- 每个Android开发者应该知道的6个SDK和API
- AndroidManifest.xml文件详解(uses-feature)
- android 获取屏幕宽高、view宽高
- android 自定义LabelView实现各类小标签,重要功能已标注
- android 自定义LabelView实现各类小标签,重要功能已标注
- Android -- 混淆
- AndroidManifest.xml中的<uses-feature>以及和<uses-permission>之间的联系
- Android Studio 快捷键大全
- Android中SQLite应用详解
- Android APK反编译就这么简单 详解(附图)
- 【通过做专题研习Android】知识点:SharedPreferences
- Android之常见问题集锦Ⅱ
- Android 5.1 SDK下载与配置
- 添加 Android Framework 到 Adt