Android 线程处理
热1 已有 301 次阅读 2012-08-23 17:29 标签: Android
1.多线程的两种实现方式:
- Thread.
- join().等待当前线程执行完毕后,才允许为其他线程的执行,如果此线程中断产生InterruptedException异常。
- yield().让此线程暂停执行,先让其他线程执行
- start(),run(),setPriority()...
- Runnable.
- 只需实现run(),但没有启动线程的start()方法,因此需要使用Thread类
2.线程安全:线程同步synchronized。可以用作线程方法和线程块。
view source print ?
3.多线程的互动处理wait()和notify()
- notify()只会唤醒同一个对象但处于wait()状态的线程。
- 这两个方法定义在Object类中,任何对象都可以使用,但必须在synchronized域中才可以调用,否则illegalMonitorStateException异常。
- 避免相互等待-死锁
4.线程通信。
UI线程(管理用户界面的线程)是不安全的,不要阻塞ui线程、确保只在ui线程中访问ui组件也就是说只能在UI线程中修改UI组件,不应出现在后台线程中修改的UI组件的情况。比较耗时的工作最好在后台进行,否则可能阻塞UI界面
主要有两种方式:
- handler.通过显式的抛出和捕获消息,与UI进行交互。
- Message. Message保存了后台返回的数据,可以存储bundle等数据形式。 messageQueue是线程对应looper的一部分,负责存储从后台进程中抛回的和当前handler绑定的message,是一个队列。
- 实现handleMessage()
- obtainMessage()获取Message对象
- sendMessage()
- Runnable.
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
- AsyncTask - AsyncTask<Params, Progress, Result>
- Params 启动任务执行的输入参数,比如HTTP请求的URL,Progress 后台任务执行的百分比。Result 后台执行任务最终返回的结果,比如String
- doInbackground().在后台线程中运行。
- onPostExcute(void result).UI线程中运行
- onProgressUpdate().doInBackground中调用了publishProgress之后,ui线程调用该方法,动态的改变进度条。
view source print ?
view source print ?
01 | class GetCSDNLogoTask extends AsyncTask<String, Integer, Bitmap>{ |
04 |
protected Bitmap doInBackground(String... url) { |
07 |
HttpClient client = new DefaultHttpClient(); |
09 |
Log.i( "log_out" , url[ 0 ]); |
10 |
HttpGet get= new HttpGet(url[ 0 ]); |
13 |
HttpResponse response =client.execute(get); |
14 |
bt=BitmapFactory.decodeStream(response.getEntity().getContent()); |
15 |
} catch (ClientProtocolException e) { |
17 |
} catch (IOException e) { |
24 |
protected void onCancelled() { |
25 |
progressBar.setProgress( 0 ); |
28 |
protected void onCancelled(Bitmap result) { |
29 |
progressBar.setProgress( 0 ); |
32 |
protected void onPostExecute(Bitmap result) { |
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..." ); |
38 |
Toast.makeText(AsyncTaskActivity. this , "failed..." , Toast.LENGTH_LONG).show(); |
42 |
protected void onPreExecute() { |
43 |
imgView.setImageBitmap( null ); |
44 |
progressBar.setProgress( 0 ); |
47 |
protected void onProgressUpdate(Integer... progress) { |
48 |
progressBar.setProgress(progress[ 0 ]); |
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- Android消息处理机制①
- 【多线程】七、阻塞队列
- 编译FFmpeg4.1.3并移植到Android(安卓)app中使用(最详细的FFmpeg-
- Android中的 Thread + Handler 线程简单应用范例
- 关于android消息处理的个人理解
- Android(安卓)实战之UI线程和Worker线程交互
- Android(安卓)第十一天重置版_新特性
- android中的jstack,看看线程都在干嘛
随机推荐
-
Android与Unity交互调用mUnityPlayer.qui
-
Android:Gradle 解析
-
New Graphics Improvement in Android(安
-
android process and thread
-
android 笔记 --- Android各种访问权限Pe
-
QCom Camera Development
-
Android(安卓)Apk 反编译,Apk 修改以后再
-
Android(安卓)- 支持不同的设备 - 支持不
-
【android内核分析-启动】Android(安卓)
-
Android中Input型输入设备驱动原理分析(