- 浏览: 42042 次
- 性别:
- 来自: 日照
最新评论
-
wuhanchendalong:
哥们你能把这个源代码的布局文件发给我好吗?我看看 非常感谢 ...
Android 自定义BaseAdapter -
greatghoul:
antkingwei 写道greatghoul 写道有木有跨平 ...
Java 在CS客户端做网页连接 -
antkingwei:
greatghoul 写道有木有跨平台的实现方法?什么意思?
Java 在CS客户端做网页连接 -
greatghoul:
有木有跨平台的实现方法?
Java 在CS客户端做网页连接
在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各有个的有点,Thread的运行速度是最快的,AsyncTask的规范性是最棒的,其它两个也有自己的优点,下面先贴上三个列子
1.Thread与Handler组合,比较常见
Handler主要是帮助我们来时时更新UI线程
这里在后天加载100张图片,然后没加载完成一个用handler 返回给UI线程一张图片并显示
最后加载完成返回一个List给UI线程 ,Handler就是一个后台线程与UI线程中间的桥梁
package com.android.wei.thread; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class Activity01 extends Activity { /** Called when the activity is first created. */ /**读取进度**/ public final static int LOAD_PROGRESS =0; /**标志读取进度结束**/ public final static int LOAD_COMPLETE = 1; /**开始加载100张图片按钮**/ Button mButton = null; /**显示内容**/ TextView mTextView = null; /**加载图片前的时间**/ Long mLoadStart = 0L; /**加载图片完成的时间**/ Long mLoadEndt = 0L; Context mContext = null; /**图片列表**/ private List<Bitmap> list; /**图片容器**/ private ImageView mImageView; //接受传过来得消息 Handler handler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case LOAD_PROGRESS: Bitmap bitmap = (Bitmap)msg.obj; mTextView.setText("当前读取到第"+msg.arg1+"张图片"); mImageView.setImageBitmap(bitmap); break; case LOAD_COMPLETE: list = (List<Bitmap>) msg.obj; mTextView.setText("读取结束一共加载"+list.size()+"图片"); break; } super.handleMessage(msg); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(R.layout.main); mButton =(Button) findViewById(R.id.button1); mTextView=(TextView) findViewById(R.id.textView1); mImageView =(ImageView) this.findViewById(R.id.imageview); mTextView.setText("点击按钮加载图片"); mButton.setOnClickListener(new OnClickListener(){ public void onClick(View v){ //调用方法 LoadImage(); } }); } public void LoadImage(){ new Thread(){ public void run(){ mLoadStart = System.currentTimeMillis(); List<Bitmap> list = new ArrayList<Bitmap>(); for(int i =0;i<100;i++){ Bitmap bitmap=ReadBitmap(mContext,R.drawable.icon); Message msg = new Message(); msg.what = LOAD_PROGRESS; msg.arg1 = i+1; list.add(bitmap); msg.obj = bitmap; handler.sendMessage(msg); } mLoadEndt = System.currentTimeMillis(); Message msg = new Message(); msg.what = LOAD_COMPLETE; msg.obj=list; msg.arg1 = (int) (mLoadEndt - mLoadStart); handler.sendMessage(msg); } }.start(); } public Bitmap ReadBitmap(Context context,int resId){ BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt); } }
2AsyncTask异步多线程
AsyncTask的规范型很强,能够时时反映更新的情况
它一般有这么几个方法
* onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
* doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
* onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
* onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.
* onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常
package com.android.wei.thread; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class Activity02 extends Activity{ /**开始StartAsync按钮**/ Button mButton = null; Context mContext = null; //内容显示出来 TextView mTextView = null; //Timer 对象 Timer mTimer = null; /** timerTask 对象**/ TimerTask mTimerTask = null; /**记录TimerId**/ int mTimerId =0; /**图片列表**/ private List<Bitmap> list; /**图片容器**/ private ImageView mImageView; public void onCreate(Bundle s){ super.onCreate(s); setContentView(R.layout.main); mContext = this; mButton =(Button) this.findViewById(R.id.button1); mImageView =(ImageView)this.findViewById(R.id.imageview); mTextView =(TextView) this.findViewById(R.id.textView1); mButton.setOnClickListener(new OnClickListener(){ public void onClick(View v){ StartAsync(); } }); } public void StartAsync(){ new AsyncTask<Object,Object,Object>(){ protected void onPreExecute(){ //首先执行这个方法,它在UI线程中,可以执行一些异步操作 mTextView.setText("开始加载进度"); super.onPreExecute(); } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub //异步后台执行,执行完毕可以返回出去一个结果 Object 对象 //得到开始加载得时间 list = new ArrayList<Bitmap>(); for(int i =0;i<100;i++){ Bitmap bitmap =ReadBitmap(mContext,R.drawable.icon); final ByteArrayOutputStream os = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); byte[] image = os.toByteArray(); Bundle bundle = new Bundle(); bundle.putInt("index", i); bundle.putByteArray("image", image); publishProgress(bundle); list.add(bitmap); } return list; } protected void onPostExecute(Object result){ //doInBackground 执行之后在这里可以接受到返回结果的对象 List<Bitmap> list = (List<Bitmap>) result; mTextView.setText("一共加载了"+list.size()+"张图片"); super.onPostExecute(result); } protected void onProgressUpdate(Object... values){ //时时拿到当前的进度更新UI Bundle bundle = (Bundle)values[0]; byte[] image = bundle.getByteArray("image"); Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length); int index = bundle.getInt("index"); mTextView.setText("当前加载进度"+index); mImageView.setImageBitmap(bitmap); super.onProgressUpdate(values); } }.execute(); } public Bitmap ReadBitmap(Context context,int resId){ BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt); } }
3TimerTask
可以根据我们的设置来间隔性的运行,可以很好的实现监听功能一般也跟handler一起
package com.android.wei.thread; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class TimerTaskActivity extends Activity{ /**执行Timer进度**/ public final static int LOAD_PROGRESS =0; /**关闭TImer进度**/ public final static int CLOSE_PROGRESS =1; /**开始TIMERTASK按钮**/ Button mButton0 = null; /**关闭TIMERTASK按钮**/ Button mButton1 =null; /**显示内容**/ TextView mTextView = null; Context mContext = null; /**timer对象**/ Timer mTimer = null; /**TimerTask对象**/ TimerTask mTimerTask = null; /**记录TimerID**/ int mTimerID =0; Handler handler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case LOAD_PROGRESS: mTextView.setText("当前得TimerID为:"+msg.arg1); break; case CLOSE_PROGRESS: mTextView.setText("当前Timer已经关闭请重新启动"); break; } super.handleMessage(msg); } }; protected void onCreate(Bundle s){ setContentView(R.layout.timer); mContext = this; mButton0 = (Button) this.findViewById(R.id.button1); mButton1 = (Button) this.findViewById(R.id.button2); mTextView = (TextView) this.findViewById(R.id.textView1); mTextView.setText("点击按钮开始更新时间"); mButton0.setOnClickListener(new OnClickListener(){ public void onClick(View v){ StartTimer(); } }); mButton1.setOnClickListener(new OnClickListener(){ public void onClick(View v){ CloseTimer(); } }); super.onCreate(s); } public void StartTimer(){ if(mTimer == null){ mTimerTask = new TimerTask(){ @Override public void run() { mTimerID ++; Message msg = new Message(); msg.what = LOAD_PROGRESS; msg.arg1 =(int) (mTimerID); handler.sendMessage(msg); } }; mTimer = new Timer(); //第一个参数为执行的mTimerTask //第二个参数为延迟得事件,这里写1000得意思是 mTimerTask将延迟1秒执行 //第三个参数为多久执行一次,这里写1000 表示没1秒执行一次mTimerTask的Run方法 mTimer.schedule(mTimerTask, 1000,1000); } } public void CloseTimer(){ if(mTimer !=null){ mTimer.cancel(); mTimer = null; } if(mTimerTask!= null){ mTimerTask = null; } mTimerID =0; handler.sendEmptyMessage(CLOSE_PROGRESS); } }
发表评论
-
android 数据库随APK打包发布
2012-03-09 22:01 2306有些时候我们的软件用到SQLite数据库,这个时候怎么把一个做 ... -
goolge 地图地址位置解析
2012-02-24 16:50 1182Java代码package com.android.yibai ... -
Android ImageView使用网上图片资源
2012-02-24 16:47 1770Java代码package com.android.antk ... -
Android手机与WEB服务器通信
2012-02-24 12:30 2748Tomcat服务器 package com.edu.q ... -
手机于PC服务器通信
2012-02-24 12:16 1114手机客户端 package com.newsocket ... -
在google地图上画出两点的行走路线
2012-02-23 12:56 1749新建一个图层 package com.androi ... -
goolge 地图弹出气泡
2012-02-23 12:50 1606新建图层 package com.android.a ... -
GPS定位那点事
2012-02-22 15:30 1460<?xml version="1.0 ... -
手机上使用google 搜索引擎
2012-02-22 15:25 1145<?xml version="1.0&q ... -
android phoneGap开发
2012-01-15 08:42 1057PhoneGap是一个用基于HTML,CSS和JavaScri ... -
Android Google地图开发入门
2011-12-29 17:17 1808Android开发要连接GoogelMaps使用MapVi ... -
集中管理Activity
2011-12-25 15:21 1128有时候在设计软件的时候布局复杂的话不利于查看跟更改,这时 ... -
Android Dilaog 设置没有标题注意的地方
2011-12-23 12:51 1404layoutInflater = LayoutInfla ... -
AndroidUI设计美化
2011-12-18 15:52 966不要说Android中UI做的丑是因为不会美化,其实做一个 ... -
Android QQ多级列表的实现
2011-12-17 19:40 2331主类: package com.android.qu ... -
Android SharedPreferences应用解析
2011-12-11 09:52 1203在任何软件中,数据存储都是非常重要的,一定程度上来说它是软件 ... -
Android GridView,Gallery动态更新数据
2011-12-09 00:05 3088package com.android.wei.z ... -
Android 划出一个半透明的PopupWindow
2011-12-07 22:22 2760效果图好像不显示了package com.android ... -
Android 自定义BaseAdapter
2011-12-04 13:57 1328不要对俺的贴图做评价 看一下代码实现 pac ... -
Android 3D壁纸开发设计
2011-11-30 19:34 1075希望能给需要得人一点帮助,这个触屏可以改变壁纸映射, J ...
相关推荐
Intent是Android中用来在组件间通信的机制,它可以启动另一个Activity或者服务,传递数据。 5. **布局设计**:XML用于定义用户界面的布局。开发者需要熟练掌握LinearLayout、RelativeLayout、ConstraintLayout等...
这只是Android开发的冰山一角,还有更多如布局管理、组件交互、网络请求、数据库操作、多线程处理、权限管理等复杂主题等待开发者深入探索。学习Android开发,需要不断实践和积累经验,才能成为一个熟练的Android...
此外,你还可以利用 .NET Framework 提供的强大功能,如 LINQ、多线程和高级数据结构,来提高开发效率和代码质量。 总之, Mono for Android 提供了一个强大的跨平台工具,让 C# 开发者能够轻松进入 Android 开发...
在Android编程领域,开发者可以创建...在实际的项目中,你可能会发现更多的实践技巧和高级特性,如多线程处理、网络请求、异步任务、动画效果等。通过不断地学习和实践,你将能够构建出更复杂、功能丰富的Android应用。
在Android应用开发中,Handler是一种线程间通信机制,它允许开发者在主线程中处理来自其他线程的消息,从而更新UI。在这个场景中,我们利用Handler实现ViewPager的自动切换效果,这种效果通常用于轮播广告或者相册...
`TabHost`则是Android中用来创建标签页切换界面的组件,它可以将多个`Fragment`或`Activity`组织在一起,通过标签页进行切换。用户可以通过点击标签来在不同的内容间快速切换,这种设计常见于新闻类应用,方便用户...
3. **Bitmap操作**:Bitmap是Android中用于存储图像数据的类。新版本可能提升了Bitmap的内存管理,例如更有效的解码策略,以减少内存占用并提高解码速度。同时,也可能提供了新的方法来方便地进行图像裁剪、旋转、...
总结,`android-word2html-master`项目提供了一种在Android平台上将Word文档转换为HTML的解决方案,涉及到了Apache POI库的使用、文档解析、HTML生成、图像处理以及异步操作等多个技术点。对于想要在Android应用中...
SQLite数据库是Android中用于存储结构化数据的标准解决方案,可以通过SQL语句进行查询和更新。 #### 十、网络 Android支持多种网络通信协议,如HTTP、FTP等。可以使用AsyncTask或者第三方库如Volley、OkHttp等进行...
- Bitmap 可以是 ARGB_8888、RGB_565、ARGB_4444 和 ALPHA_8 等几种颜色模式,每种模式有不同的内存占用和显示效果。 2. **加载 Bitmap** - 使用 BitmapFactory 类来从资源文件、本地文件系统、网络或内存中解码...
如果Koder的代码中用到了Anko,那么它可能增强了项目的Android端功能。 5. **Gradle构建系统**:Kotlin项目通常使用Gradle作为构建工具,它可以管理和编译项目依赖,同时也支持自定义构建脚本,以适应项目特定的...
4. **ListView/RecyclerView**:这两个组件是Android中用来展示列表数据的关键控件。在瀑布流布局中,我们需要自定义适配器(Adapter)来处理多列布局。可以使用`StaggeredGridLayoutManager`或第三方库如`...
6. **Anko库**:可能在项目中用到,Anko是JetBrains提供的一个库,简化了Android开发中的许多任务,如DSL(领域特定语言)来创建布局,轻量级的Lambda表达式替代匿名内部类等。 7. **Android开发**:如果项目是针对...
4. **多线程**:Java提供了强大的多线程支持,允许同时执行多个任务,提高程序效率。Tiger_mod可能利用了线程来实现并行处理或异步操作。 5. **IO流**:Java的IO流用于读写文件和网络通信,可能在Tiger_mod中用于...
6. **多线程**:Java提供了内置的多线程支持,使得程序能够同时执行多个任务,提高系统性能。 7. **异常处理**:Java的try-catch-finally语句用于捕获和处理运行时错误,保证程序的健壮性。 8. **Java标准库(JDK...
WebRTC 使用多线程模型来处理不同的任务,如网络通信、媒体处理等。 - **4.1.3 名称转换** 用于在网络通信中转换域名和 IP 地址。 - **4.1.4 SSL 支持** WebRTC 支持通过 SSL/TLS 协议来加密信令消息,保护...
6. **多线程**:Java内置了对多线程的支持,允许程序同时执行多个任务,提升效率。 7. **接口与抽象类**:接口是完全抽象的,只定义方法签名,而抽象类可以有部分实现。它们是实现多态的不同方式。 8. **反射机制*...