1.基于消息的通信机制 Intent ---boudle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。 2. 利用static静态数据, public static成员变量; 3.基于外部存储的传输, File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider 4.基于IPC的通信机制 context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。 示例: http://www.eoeandroid.com/thread-36249-1-1.html 5. 基于Application Context, 例子如下文: 在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:
对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。 注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了, ) ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。 那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。
上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在<application>标签中使用android:name属性来指定这个类,代码如 下:
接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:
上面两段代码可以在任何的Service、Activity中使用。全局的。
第一种:可能大部分人在学习android的时候,都会自主用线程池另开辟一条后台线程,或者直接新启一条线程,。这里和android四大组件之一的Service并不相冲突。下载的时候毕竟还是线程方法体内执行的,即使是Service可能还要做些其他事,并一定让它处于阻塞状态,废话有点多。。 第二种:Android的os包下还提供了一种集成handler的类,使用起来代码量相对少很多,理解相对就麻烦点,但也不是太难。。 AsyncTask 这个类一看就是和异步操作有关系的 只要写一个类去继承AsyncTask,重写某些方法就可以实现异步效果,并时时更新进度条。。。 Activity中调用这个类,只需要传入你需要时时改变的Widget控件就可以了 public class PageTask extends AsyncTask<String, Integer, String> { private TextView message; private ProgressBar progressBar; public PageTask(TextView message, ProgressBar progressBar) { super(); this.message = message; this.progressBar = progressBar; } //可变长的输入参数,与AsyncTask.exucute()对应 @Override protected String doInBackground(String... params) { System.out.println("doInBackground..."); int i=0; for( i=10;i<101;i+=10){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } publishProgress(i); } return i+""; } @Override protected void onCancelled() { System.out.println("onCancelled..."); super.onCancelled(); } @Override protected void onPostExecute(String result) { //返回HTML页面的内容 System.out.println("onPostExecute:"+result); message.setText(result); } @Override protected void onPreExecute() { //任务启动,可以在这里显示一个对话框,这里简单处理 System.out.println("onPreExecute..."); message.setText(R.string.task_started); } @Override protected void onProgressUpdate(Integer... values) { //更新进度 System.out.println("onProgressUpdate..."); progressBar.setProgress(values[0]); } 这里给出例子。。代码少很多哦 ![]()
|
Activity之间数据传递与共享的几种途径(bitmap篇)&异步加载&service
最新推荐文章于 2024-04-30 14:33:09 发布