UI更新方法
来源:互联网 发布:如何投诉淘宝店铺客服 编辑:程序博客网 时间:2024/06/05 21:54
在讲解更新UI方法前,我们先来了解一些概念:
当应用启动,系统会创建一个主线程(main thread)。这个主线程负责向UI组件分发事件(包括绘制事件),UI的更新也必须在主线程中完成,让主线程做处理,因此也可以说,主线程即UI线程。主线程主要的职责是:(1)快速处理UI事件,(2)快速处理Broadcast消息。
我们的耗时操作不能阻塞主线程,要保证应用的响应性, 所以当你的操作不是即时的那种(not instantaneous),你应该把他们放进单另的线程中(叫做background或者叫worker线程)。
了解了这些后,我们就知道为什么需要在另外的线程中进行耗时操作,然后再更新UI的时候切换回主线程进行页面更新,Android提供了一下这几种方法用于UI更新:
一、runOnUiThread()
1.定义runable要执行的操作:
private Activity mActivity= this;private Runnable mRunnable; mRunnable = new Runnable() { @Override public void run() { mTextView3.setText("UI update success"); } };2.使用的时候:mActivity.runOnUiThread(mRunnable);
二、view.post()
1.定义runable要执行的操作:同上
2.使用的时候:mTextView3.post(mRunnable);
三、Handler:略
四、AsyncTask:摘自http://www.cnblogs.com/wenjiang/p/3180324.html
AsyncTask的原理和Handler很接近,都是通过往主线程发送消息来更新主线程的UI,这种方式是异步的,所以就叫AsyncTask。使用AsyncTask的场合像是下载文件这种会严重阻塞主线程的任务就必须放在异步线程里面:
public class MainActivity extends Activity { private Button mButton; private ImageView mImageView; private ProgressBar mProgressBar; @SuppressLint("HandlerLeak") @Override 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() { @Override public void onClick(View v) { AsyncTaskThread thread = new AsyncTaskThread(); thread.execute("http://g.search2.alicdn.com/img/bao/uploaded/i4/" + "i4/12701024275153897/T1dahpFapbXXXXXXXX_!!0-item_pic.jpg_210x210.jpg"); } }); } class AsyncTaskThread extends AsyncTask<String, Integer, Bitmap> { @Override protected Bitmap doInBackground(String... params) { publishProgress(0); HttpClient client = new DefaultHttpClient(); publishProgress(30); HttpGet get = new HttpGet(params[0]); final Bitmap bitmap; try { HttpResponse response = client.execute(get); bitmap = BitmapFactory.decodeStream(response.getEntity() .getContent()); } catch (Exception e) { return null; } publishProgress(100); return bitmap; } protected void onProgressUpdate(Integer... progress) { mProgressBar.setProgress(progress[0]); } protected void onPostExecute(Bitmap result) { if (result != null) { Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG) .show(); mImageView.setImageBitmap(result); } else { Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG) .show(); } } protected void onPreExecute() { mImageView.setImageBitmap(null); mProgressBar.setProgress(0); } protected void onCancelled() { mProgressBar.setProgress(0); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}注意:AsyncTask最多支持127线程,超128线程就会崩溃。
0 0
- 更新UI的方法
- UI更新方法
- 更新ui的方法
- Handler: 更新UI的方法
- Handler:更新UI的方法
- Handler:更新UI的方法
- Handler:更新UI的方法
- Timer更新UI的方法
- Android更新UI的方法
- android更新UI的方法
- UI更新三种方法
- 更新UI 2种方法
- Android更新ui的方法
- Android:UI更新方法五:利用AsyncTask更新UI
- android 更新UI方法和联网方法
- 跨线程更新UI控件的方法
- Handler更新UI的几种方法
- 子线程更新UI的方法
- 常用的Http Response Code状态码一览表
- 解决Android从相册中获取图片却无法裁剪的问题
- Swift学习: 从Objective-C到Swift
- Jquery中判断是否含有某种属性
- POJ 1548 (最长公共子串)
- UI更新方法
- SQL SERVER里从一个数据库导出表结构和表数据到另一个表中
- Java程序员开发参考资源
- 比较完整的junit单元测试之-----mock模拟测试
- jsp中session.getAttribute()取值为空
- JVM垃圾收集算法
- 多jdk环境变量配置问题(jdk1.6,jdk1.7,jdk1.8)
- SVG简介
- 知乎安卓客户端关注和取消关注的这个按钮点击特效是怎么实现的?