通过内部存储方式实现了在两个activity之间传递bitmap对象以及其它支持串行化的java对象,关键点有如下:
1. http客户端下载图片,通过imageview对象显示
2. 把imageview上的bitmap对象从当前activity传递到另外一个activity中并显示出来
3. 基于串行化传递java对象数据
首先看我是怎么实现http客户端下载图片,通过异步task接口实现http客户端下载图片并通过handler来更新imageview,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package com.example.sharedemo; import java.io.ioexception; import java.io.inputstream; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.httpstatus; import org.apache.http.client.clientprotocolexception; import org.apache.http.client.httpclient; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.defaulthttpclient; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.asynctask; import android.os.handler; import android.os.message; import android.util.log; public class imageloadtask extends asynctask<string, void , bitmap> { private handler handler; public imageloadtask(handler handler) { this .handler = handler; } protected void onpostexecute(bitmap bitmap) { message msg = new message(); msg.obj = bitmap; handler.sendmessage(msg); } @override protected bitmap doinbackground(string... urls) { bitmap bitmap = null ; // create http client httpclient httpclient = new defaulthttpclient(); try { // get request log.i( "image-url" , urls[ 0 ]); httpget httprequest = new httpget(urls[ 0 ]); httpresponse httpresponse = httpclient.execute(httprequest); if (httpresponse.getstatusline().getstatuscode() == httpstatus.sc_ok) { // get entity from response httpentity httpentity = httpresponse.getentity(); // read stream inputstream is = httpentity.getcontent(); bitmap = bitmapfactory.decodestream(is); is.close(); log.i( "image" , "already get the image by url : " + urls[ 0 ]); } } catch (clientprotocolexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally { httpclient.getconnectionmanager().shutdown(); } return bitmap; } } |
在当前的activity中通过按钮上的事件响应实现切换view到对应的activity中去,同时实现java串行化数据传递。mainactivity的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
package com.example.sharedemo; import java.io.bytearrayoutputstream; import java.io.fileoutputstream; import android.app.activity; import android.content.context; import android.content.intent; import android.graphics.bitmap; import android.graphics.matrix; import android.graphics.drawable.bitmapdrawable; import android.os.bundle; import android.os.handler; import android.os.message; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; public class mainactivity extends activity implements onclicklistener{ public final static string share_bitmap_command = "share-image" ; public final static string share_text_data_command = "share-text-data" ; private handler handler; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main); setuponclicklistener(); } private void setuponclicklistener() { button bitmapbtn = (button) this .findviewbyid(r.id.bitmapsharebtn); bitmapbtn.settag(share_bitmap_command); bitmapbtn.setonclicklistener( this ); button textdatabtn = (button) this .findviewbyid(r.id.mapsharebtn); textdatabtn.settag(share_text_data_command); textdatabtn.setonclicklistener( this ); final imageview imageview = (imageview) this .findviewbyid(r.id.imageview1); handler = new handler() { public void handlemessage(message msg) { bitmap bitmap = (bitmap)msg.obj; if (bitmap != null ) { /* // 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始bitmap占用的内存 bitmap smallbitmap = zoombitmap(bitmap, bitmap.getwidth()/ 5, bitmap.getheight() / 5); // 释放资源 bitmap.recycle(); // 显示图片 imageview.setimagebitmap(smallbitmap); imageview.invalidate(); */ imageview.setimagebitmap(bitmap); } } }; imageloadtask task = new imageloadtask(handler); task.execute( "http://img.blog.csdn.net/20150607143208238" ); } public static bitmap zoombitmap(bitmap bitmap, int width, int height) { int w = bitmap.getwidth(); int h = bitmap.getheight(); matrix matrix = new matrix(); float scalewidth = (( float ) width / w); float scaleheight = (( float ) height / h); matrix.postscale(scalewidth, scaleheight); // 不改变原来图像大小 bitmap newbmp = bitmap.createbitmap(bitmap, 0 , 0 , w, h, matrix, true ); return newbmp; } @override public void onclick(view v) { object tag = v.gettag(); log.i( "command" , tag.tostring()); if (share_bitmap_command.equals(tag)) { intent intent = new intent( this .getapplicationcontext(), imageprocessactivity. class ); imageview imageview = (imageview) this .findviewbyid(r.id.imageview1); bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); intent.putextra( "selectedimage" , bitmap); intent.putextra( "name" , "lena" ); intent.putextra( "description" , "超级大美女" ); this .startactivity(intent); } else if (share_text_data_command.equals(tag)) { intent intent = new intent( this .getapplicationcontext(), imageprocessactivity. class ); imageview imageview = (imageview) this .findviewbyid(r.id.imageview1); bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); // save it first then pass uri imageinfobean dto = new imageinfobean(); string uri = createimagefrombitmap(bitmap); dto.setdescription( "超级大美女" ); dto.setname( "lena" ); dto.seturi(uri); intent.putextra( "tiger" , dto); this .startactivity(intent); } } public string createimagefrombitmap(bitmap bitmap) { string filename = "myimage" ; try { bytearrayoutputstream bytes = new bytearrayoutputstream(); bitmap.compress(bitmap.compressformat.jpeg, 100 , bytes); fileoutputstream fo = openfileoutput(filename, context.mode_private); fo.write(bytes.tobytearray()); fo.close(); } catch (exception e) { e.printstacktrace(); filename = null ; } log.i( "filename" , filename); return filename; } } |
对应另外一个activity中实现读取与组装bitmap对象显示的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package com.example.sharedemo; import java.io.filenotfoundexception; import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.bundle; import android.widget.imageview; import android.widget.textview; public class imageprocessactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.share_info); backfilldata(); } private void backfilldata() { object obj = this .getintent().getextras().get( "tiger" ); imageview imageview = (imageview) this .findviewbyid(r.id.imageview1); textview text1 = (textview) this .findviewbyid(r.id.textview1); textview text2 = (textview) this .findviewbyid(r.id.textview2); try { if (obj != null && obj instanceof imageinfobean) { imageinfobean dto = (imageinfobean)obj; bitmap bitmap = bitmapfactory.decodestream( this .openfileinput(dto.geturi())); imageview.setimagebitmap(bitmap); imageview.invalidate(); // refresh text1.settext( "名称: " + dto.getname()); text2.settext( "描述: " + dto.getdescription()); return ; } } catch (filenotfoundexception e) { e.printstacktrace(); } bitmap bitmap = (bitmap) this .getintent().getparcelableextra( "selectedimage" ); string name = this .getintent().getextras().getstring( "name" ); string description = this .getintent().getextras().getstring( "description" ); if (bitmap != null ) { imageview.setimagebitmap(bitmap); imageview.invalidate(); // refresh } if (name != null ) { text1.settext( "名称: " + name); } if (description != null ) { text2.settext( "描述: " + description); } } } |
对应的java串行化对象类代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package com.example.sharedemo; import java.io.serializable; public class imageinfobean implements serializable { /** * */ private static final long serialversionuid = 1l; public string getname() { return name; } public void setname(string name) { this .name = name; } public string getdescription() { return description; } public void setdescription(string description) { this .description = description; } public string geturi() { return uri; } public void seturi(string uri) { this .uri = uri; } private string name; private string description; private string uri; } |
最后声明:
别忘记在manifest文件添加网络访问的权限
1
|
<uses-permission android:name= "android.permission.internet" /> |
第一个按钮【传递图片】将会演示我遇到错误,第二按钮【传递文本数据】
将会演示正确的处理结果,显示如下:
以上就是本文的全部内容,希望对大家的学习有所帮助。