全局获取Context的技巧,使用intent来传递对象
2015-09-08 17:02
381 查看
举例获得Context
例如我们编写了一个HttpUtil类,然后封装了起来public class HttpUtil{ public static void sendHttpRequest(final String address,final HttpCallbackListener listener){ new Thread(new Runnable()){ @override public void run() { HttpURLConnection connection = null; try{ URL url = new URL(address); connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); connection.setDoInput(true); connection.setDoOutput(true); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in); StringBuilder response =new StringBuilder(); String line=null; while ((line = reader.readLine())!=null){ response.append(line); } if (listener!=null){ listener.onFinish(response.toString()); } }catch (Exception e) { if (listener!=null){ listener.onError(e); } }finally { if(connection!=null){ connection.disconnection(); } } } }).start(); } }
当我们想在里面打印Toast时,却发现找不到context,这是我们可以定制自己的Application类,以便管理一些全局的状态信息,比如说全局Context.
public class MyApplication extends Application{ private static Context context; @override public void onCreate(){ context=getApplicationContext(); } public static Context getContext(){ return context; } }
然后在配置文件下添加android:name 的参数
<application android:name="com.example.networktest.MyApplication">
使用intent传递数据
我们已经知道intent可以传递一些附加数据例如:
Intent intentNext = new Intent(getApplicationContext(), MusicService.class); intentNext.putExtra("musicpath", songPath); intentNext.putExtra(PLAY_TYPE_FLAG, TYPE_PLAYER); startActivity(intent);
Serializable(序列化)方式
表示将一个对象转化成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也是很简单,只需要一个类去实现Serializable这个接口就可以了。public class Person implentents Serializable{ private String name; private int age; public String getName(){ return name; } public void setName(String name){ this.name=name; } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } }
这里让Person类去实现了Serializable接口,这样所有的Person对象就都是可以序列化的了。
Person person=new Person(); person.setName("tom"); person.setAge(10); Intent intent =new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("person_data",person); startActivity(intent);
在SecondActivity中获得对象的方法为
Person person=(Person)getIntent().getSerializableExtra("person_data");
Parcelable方式
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型。public class Person implements Parcelable{ private String name; private int age; public String getName(){ return name; } public void setName(String name){ this.name=name; } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } @override public void writeToParcel(Parcel dest,int flags){ dest.writeString(name);//写出name dest.writeInt(age);//写出age } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){ @override public Person createFromParcel(Parcel source){ Person person=new Person(); person.name=source.readString();//读取name person.age = source.readInt();//读取age return person; } @override public Person[] newArray(int size){ return new Person[size]; } }; }
接下来我们在FirstActivity中用同样的形式来传递数据
但是
在SecondActivity中获取对象有所不同,如下:
Person person =(Person) getIntent().getParcelableExtra("person_data");
Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable方式低一些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。
相关文章推荐
- Sql语句 表中相同的记录(某个字段)只显示一条,按照时间排序显示最大或最小
- 枚举类型(C#)
- 模板类的继承
- Liner(分段线性插值)
- zabbix 监控 hp硬件
- STM32的ADC的DMA方式
- 对象赋值为null时 内存分配情况,以及什么时候使用效率高
- android开发记录
- CSS 最核心的几个概念
- Docker命令详解
- hdu 1030 Delta-wave
- 计算机视觉数据集
- easy ui jquery 添加时样式出现问题
- 数据结构——有序线性表的的插入与删除
- C++成员变量的初始化顺序问题
- iOS sqlite 数据库加密
- 从输入 URL 到页面加载完的过程中都发生了什么事情---经典面试题
- javascript中加法操作符与减法操作符在字符串与数字相加时的区别
- jquery+ajax简单例子及jquery事件
- writelog 日志写入函数