Android 线程处理

1 已有 301 次阅读 2012-08-23 17:29 标签: Android

1.多线程的两种实现方式:

  1. Thread.
    1. join().等待当前线程执行完毕后,才允许为其他线程的执行,如果此线程中断产生InterruptedException异常。
    2. yield().让此线程暂停执行,先让其他线程执行
    3. start(),run(),setPriority()...
  2. Runnable.
    1. 只需实现run(),但没有启动线程的start()方法,因此需要使用Thread类

2.线程安全:线程同步synchronized。可以用作线程方法和线程块。

view source print ?
1 //synchronized自成一个区块,可以灵活的指定对象与程序区块
2 synchronized(this){
3 code...
4 }

3.多线程的互动处理wait()和notify()

  1. notify()只会唤醒同一个对象但处于wait()状态的线程。
  2. 这两个方法定义在Object类中,任何对象都可以使用,但必须在synchronized域中才可以调用,否则illegalMonitorStateException异常。
  3. 避免相互等待-死锁
4.线程通信。

UI线程(管理用户界面的线程)是不安全的,不要阻塞ui线程、确保只在ui线程中访问ui组件也就是说只能在UI线程中修改UI组件,不应出现在后台线程中修改的UI组件的情况。比较耗时的工作最好在后台进行,否则可能阻塞UI界面

主要有两种方式:

  1. handler.通过显式的抛出和捕获消息,与UI进行交互。
    1. Message. Message保存了后台返回的数据,可以存储bundle等数据形式。 messageQueue是线程对应looper的一部分,负责存储从后台进程中抛回的和当前handler绑定的message,是一个队列。
      1. 实现handleMessage()
      2. obtainMessage()获取Message对象
      3. sendMessage()
    2. Runnable.
      1. Activity.runOnUiThread(Runnable)
      2. View.post(Runnable)
      3. View.postDelayed(Runnable, long)
  2. AsyncTask - AsyncTask<Params, Progress, Result>
    1. Params 启动任务执行的输入参数,比如HTTP请求的URL,Progress 后台任务执行的百分比。Result 后台执行任务最终返回的结果,比如String
    2. doInbackground().在后台线程中运行。
    3. onPostExcute(void result).UI线程中运行
    4. onProgressUpdate().doInBackground中调用了publishProgress之后,ui线程调用该方法,动态的改变进度条。

view source print ?
1 //下面提供一个简单的Asynctask的实例
view source print ?
01 class GetCSDNLogoTask extends AsyncTask<String, Integer, Bitmap>{
02 //String 传入参数类型,Integer 进度显示,Bitmap 返回值类型,这个类用于异步获取图片内容
03 @Override
04 protected Bitmap doInBackground(String... url) {
05 // TODO Auto-generated method stub
06 publishProgress(0); //将会调用onProgressUpdate(Integer... progress)
07 HttpClient client =new DefaultHttpClient();
08 publishProgress(30);
09 Log.i("log_out", url[0]);
10 HttpGet get=new HttpGet(url[0]);
11 final Bitmap bt;
12 try {
13 HttpResponse response =client.execute(get);
14 bt=BitmapFactory.decodeStream(response.getEntity().getContent());
15 } catch (ClientProtocolException e) {
16 return null;
17 } catch (IOException e) {
18 return null;
19 }
20 publishProgress(100);
21 return bt;
22 }
23 @Override
24 protected void onCancelled() {
25 progressBar.setProgress(0);
26 }
27 @Override
28 protected void onCancelled(Bitmap result) {
29 progressBar.setProgress(0);
30 }
31 @Override
32 protected void onPostExecute(Bitmap result) {
33 if(result != null){
34 Toast.makeText(AsyncTaskActivity.this, "success to get the logo...", Toast.LENGTH_LONG).show();
35 imgView.setImageBitmap(result);
36 Log.i("Log_out","img setting...");
37 }else {
38 Toast.makeText(AsyncTaskActivity.this, "failed...", Toast.LENGTH_LONG).show();
39 }
40 }
41 @Override
42 protected void onPreExecute() { //在doInBackground()之�会被调用,在ui线程执行
43 imgView.setImageBitmap(null);
44 progressBar.setProgress(0);
45 }
46 @Override
47 protected void onProgressUpdate(Integer... progress) {//更新进度�进度
48 progressBar.setProgress(progress[0]);
49 }
50 }

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android消息处理机制①
  3. 【多线程】七、阻塞队列
  4. 编译FFmpeg4.1.3并移植到Android(安卓)app中使用(最详细的FFmpeg-
  5. Android中的 Thread + Handler 线程简单应用范例
  6. 关于android消息处理的个人理解
  7. Android(安卓)实战之UI线程和Worker线程交互
  8. Android(安卓)第十一天重置版_新特性
  9. android中的jstack,看看线程都在干嘛

随机推荐

  1. Android与Unity交互调用mUnityPlayer.qui
  2. Android:Gradle 解析
  3. New Graphics Improvement in Android(安
  4. android process and thread
  5. android 笔记 --- Android各种访问权限Pe
  6. QCom Camera Development
  7. Android(安卓)Apk 反编译,Apk 修改以后再
  8. Android(安卓)- 支持不同的设备 - 支持不
  9. 【android内核分析-启动】Android(安卓)
  10. Android中Input型输入设备驱动原理分析(