1.怎么使用AsyncTask+Handler传值
地址:http://www.oschina.net/code/snippet_725438_49858
[1].[代码] [Java]代码 跳至 [1] [2] [3] [4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
布局文件:
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<ImageView android:id=
"@+id/im1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/ic_launcher"
/>
<ImageView android:id=
"@+id/im2"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/ic_launcher"
/>
</LinearLayout>
|
[2].[代码] [Java]代码 跳至 [1] [2] [3] [4]
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
2
.第一种,回调方法方式:
package
com.androidwallpaper;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
java.net.HttpURLConnection;
import
java.net.MalformedURLException;
import
java.net.URL;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
android.net.Uri;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.app.Activity;
import
android.app.WallpaperManager;
import
android.content.Intent;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.view.Menu;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.ImageView;
import
android.widget.ProgressBar;
import
android.widget.Toast;
public
class
MainActivity
extends
Activity
implements
OnClickListener{
ImageView im1;
ImageView im2;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
im1 = (ImageView) findViewById(R.id.im1);
im2 = (ImageView) findViewById(R.id.im2);
try
{
final
ImageViewAsyncTask task =
new
ImageViewAsyncTask(
"http://static.oschina.net/uploads/ad/new_banner_one_ronglianyun_WrqUs.png"
);
task.setOnDataFinishedListener(
new
OnDataFinishedListener() {
@Override
public
void
onDataSuccessfully(Object data) {
try
{
im1.setImageBitmap((Bitmap) data);
}
catch
(Exception e) {
e.printStackTrace();
}
}
@Override
public
void
onDataFailed() {
Toast.makeText(MainActivity.
this
,
"加载失败!"
, Toast.LENGTH_SHORT).show();
}
});
task.execute();
}
catch
(Exception e) {
e.printStackTrace();
}
}
class
ImageViewAsyncTask
extends
AsyncTask<String, Integer, Bitmap> {
String mUrl;
OnDataFinishedListener onDataFinishedListener;
public
ImageViewAsyncTask(String url){
this
.mUrl = url;
}
public
void
setOnDataFinishedListener(
OnDataFinishedListener onDataFinishedListener) {
this
.onDataFinishedListener = onDataFinishedListener;
}
@Override
protected
Bitmap doInBackground(String... params) {
InputStream ins =
null
;
Bitmap bitmap =
null
;
try
{
URL url =
new
URL(mUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if
(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
ins = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(ins);
return
bitmap;
}
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(ins!=
null
){
try
{
ins.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
null
;
}
@Override
protected
void
onPreExecute() {
super
.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected
void
onPostExecute(Bitmap result) {
progressBar.setVisibility(View.GONE);
if
(result!=
null
){
onDataFinishedListener.onDataSuccessfully(result);
}
else
{
onDataFinishedListener.onDataFailed();
}
}
@Override
protected
void
onProgressUpdate(Integer... values) {
super
.onProgressUpdate(values);
}
}
}
|
[3].[代码] [Java]代码 跳至 [1] [2] [3] [4]
1
2
3
4
5
6
7
8
|
回调接口:
public
interface
OnDataFinishedListener {
public
void
onDataSuccessfully(Object data);
public
void
onDataFailed();
}
|
[4].[代码] [Java]代码 跳至 [1] [2] [3] [4]
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
|
第二种:使用handler:
1
.修改ImageViewAsyncTask:
public
class
ImageViewAsyncTask
extends
AsyncTask<String, Integer, Bitmap> {
String mUrl;
Handler mHandler;
public
ImageViewAsyncTask(String url,Handler handler){
this
.mUrl = url;
this
.mHandler = handler;
}
@Override
protected
Bitmap doInBackground(String... params) {
InputStream ins =
null
;
Bitmap bitmap =
null
;
try
{
URL url =
new
URL(mUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if
(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
ins = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(ins);
return
bitmap;
}
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(ins!=
null
){
try
{
ins.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
null
;
}
@Override
protected
void
onPreExecute() {
super
.onPreExecute();
}
@Override
protected
void
onPostExecute(Bitmap result) {
super
.onPostExecute(result);
Message msg = mHandler.obtainMessage();
if
(result!=
null
){
msg.what =
1
;
msg.obj = result;
}
else
{
msg.what =
2
;
}
mHandler.sendMessage(msg);
}
@Override
protected
void
onProgressUpdate(Integer... values) {
super
.onProgressUpdate(values);
}
}
2
.调用方式:
ImageViewAsyncTask task2 =
new
ImageViewAsyncTask(
"http://static.oschina.net/uploads/ad/new_banner_one_ronglianyun_WrqUs.png"
, handler);
task2.execute();
Handler handler =
new
Handler(){
@Override
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
1
:
Bitmap bitmap = (Bitmap) msg.obj;
im2.setImageBitmap(bitmap);
break
;
default
:
break
;
}
}
};
|
Android Volley完全解析(一),初识Volley的基本用法
Android Volley完全解析(二),使用Volley加载网络图片
Android Volley完全解析(三),定制自己的Request
Android Volley完全解析(四),带你从源码的角度理解Volley
3.json解析 异步请求之后需要把返回的值变成对象 使用gson
一、 谷歌GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
Gson的jar:http://code.google.com/p/google-gson/
然后将数据转为json字符串,核心函数是:
B、客户端将json字符串转换为相应的javaBean
public class HttpUtil
{
}
2、使用泛型获取javaBean(核心函数)
public static <T> List<T> getPersons(String jsonString, Class<T> cls) {
public static List<Map<String, Object>> listKeyMaps(String jsonString) {
原文地址:http://blog.sina.com.cn/s/blog_7ffb8dd501013q9c.html
这里介绍的是泛型 我觉得很好,或者你也可以用到什么什么的时候就解析什么 随便
3.1使用gson解析json数据,这个里面讲的蛮好,
下面我将以一个具体的列子来说明通过Gson方式解析复杂的json数据
1.将要解析的数据如下面的格式
{
"error": 0,
"status": "success",
"date": "2014-05-10",
"results": [
{
"currentCity": "南京",
"weather_data": [
{
"date": "周六(今天, 实时:19℃)",
"dayPictureUrl": "http://api.map.baidu.com/images/weather/day/dayu.png",
"nightPictureUrl": "http://api.map.baidu.com/images/weather/night/dayu.png",
"weather": "大雨",
"wind": "东南风5-6级",
"temperature": "18℃"
},
{
"date": "周日",
"dayPictureUrl": "http://api.map.baidu.com/images/weather/day/zhenyu.png",
"nightPictureUrl": "http://api.map.baidu.com/images/weather/night/duoyun.png",
"weather": "阵雨转多云",
"wind": "西北风4-5级",
"temperature": "21 ~ 14℃"
}
]
}
]
}
2.必须定义如下一些的javaBean数据
Status.java
- public class Status
- {
- private String error;
- private String status;
- private String date;
- private List<Results> results;
- public String getError()
- {
- return error;
- }
- public void setError(String error)
- {
- this.error = error;
- }
-
- public String getStatus()
- {
- return status;
- }
- public void setStatus(String status)
- {
- this.status = status;
- }
- public String getDate()
- {
- return date;
- }
- public void setDate(String date)
- {
- this.date = date;
- }
- public List<Results> getResults()
- {
- return results;
- }
- public void setResults(List<Results> results)
- {
- this.results = results;
- }
- @Override
- public String toString()
- {
- return "Status [error=" + error + ", status=" + status
- + ", date=" + date + ", results=" + results + "]";
- }
- </span>
Results.java
- public class Results
- {
- private String currentCity;
- private List<Weather> weather_data;
- public String getCurrentCity()
- {
- return currentCity;
- }
- public void setCurrentCity(String currentCity)
- {
- this.currentCity = currentCity;
- }
- public List<Weather> getWeather_data()
- {
- return weather_data;
- }
- public void setWeather_data(List<Weather> weather_data)
- {
- this.weather_data = weather_data;
- }
- @Override
- public String toString()
- {
- return "Results [currentCity=" + currentCity + ", weather_data="
- + weather_data + "]";
- }
Weather.java
- public class Weather {
- private String date;
- private String dayPictureUrl;
- private String nightPictureUrl;
- private String weather;
- private String wind;
- private String temperature;
- public String getDate() {
- return date;
- }
- public void setDate(String date) {
- this.date = date;
- }
- public String getDayPictureUrl() {
- return dayPictureUrl;
- }
- public void setDayPictureUrl(String dayPictureUrl) {
- this.dayPictureUrl = dayPictureUrl;
- }
- public String getNightPictureUrl() {
- return nightPictureUrl;
- }
- public void setNightPictureUrl(String nightPictureUrl) {
- this.nightPictureUrl = nightPictureUrl;
- }
- public String getWeather() {
- return weather;
- }
- public void setWeather(String weather) {
- this.weather = weather;
- }
- public String getWind() {
- return wind;
- }
- public void setWind(String wind) {
- this.wind = wind;
- }
- public String getTemperature() {
- return temperature;
- }
- public void setTemperature(String temperature) {
- this.temperature = temperature;
- }
- @Override
- public String toString() {
- return "Weather [date=" + date + ", dayPictureUrl="
- + dayPictureUrl + ", nightPictureUrl="
- + nightPictureUrl + ", weather=" + weather
- + ", wind=" + wind + ", temperature=" + temperature
- + "]";
- }
-
- public class Status
- {
- private String error;
- private String status;
- private String date;
- private List<Results> results;
- public String getError()
- {
- return error;
- }
- public void setError(String error)
- {
- this.error = error;
- }
- public String getStatus()
- {
- return status;
- }
- public void setStatus(String status)
- {
- this.status = status;
- }
- public String getDate()
- {
- return date;
- }
- public void setDate(String date)
- {
- this.date = date;
- }
- public List<Results> getResults()
- {
- return results;
- }
- public void setResults(List<Results> results)
- {
- this.results = results;
- }
- @Override
- public String toString()
- {
- return "Status [error=" + error + ", status=" + status
- + ", date=" + date + ", results=" + results + "]";
- }
- </span>
- public class Results
- {
- private String currentCity;
- private List<Weather> weather_data;
- public String getCurrentCity()
- {
- return currentCity;
- }
- public void setCurrentCity(String currentCity)
- {
- this.currentCity = currentCity;
- }
- public List<Weather> getWeather_data()
- {
- return weather_data;
- }
- public void setWeather_data(List<Weather> weather_data)
- {
- this.weather_data = weather_data;
- }
- @Override
- public String toString()
- {
- return "Results [currentCity=" + currentCity + ", weather_data="
- + weather_data + "]";
- }
- public class Weather {
- private String date;
- private String dayPictureUrl;
- private String nightPictureUrl;
- private String weather;
- private String wind;
- private String temperature;
- public String getDate() {
- return date;
- }
- public void setDate(String date) {
- this.date = date;
- }
- public String getDayPictureUrl() {
- return dayPictureUrl;
- }
- public void setDayPictureUrl(String dayPictureUrl) {
- this.dayPictureUrl = dayPictureUrl;
- }
- public String getNightPictureUrl() {
- return nightPictureUrl;
- }
- public void setNightPictureUrl(String nightPictureUrl) {
- this.nightPictureUrl = nightPictureUrl;
- }
- public String getWeather() {
- return weather;
- }
- public void setWeather(String weather) {
- this.weather = weather;
- }
- public String getWind() {
- return wind;
- }
- public void setWind(String wind) {
- this.wind = wind;
- }
- public String getTemperature() {
- return temperature;
- }
- public void setTemperature(String temperature) {
- this.temperature = temperature;
- }
- @Override
- public String toString() {
- return "Weather [date=" + date + ", dayPictureUrl="
- + dayPictureUrl + ", nightPictureUrl="
- + nightPictureUrl + ", weather=" + weather
- + ", wind=" + wind + ", temperature=" + temperature
- + "]";
- }
4.如果只是解决图片缓存加载的问题 就只使用Universal_Image_loader就够了
5.频繁操作的话选择Volley 但是传递的数据量不能很大 而且到底在使用post方法的时候没法直接用,必须自己去定制,那么我还不如自己写吧,
GetHttp
public class GetHttp {
public static String RequstGetHttp(String strUrl) {
URL url = null;
String result="";
try {
url = new URL(strUrl);
HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setConnectTimeout(1000);
urlconn.setReadTimeout(15000);
urlconn.connect();// 链接服务器并发送消息
// 开始接收返回的数据
InputStreamReader is = new InputStreamReader(urlconn.getInputStream());
BufferedReader bufferedReader = new BufferedReader(is);
String readLine = "";
while ((readLine = bufferedReader.readLine()) != null) {
result += readLine;
}
is.close();
urlconn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
PostHttp:
public class GetHttp {
public static String RequstGetHttp(String strUrl) {
URL url = null;
String result="";
try {
url = new URL(strUrl);
HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setConnectTimeout(1000);
urlconn.setReadTimeout(15000);
urlconn.connect();// 链接服务器并发送消息
// 开始接收返回的数据
InputStreamReader is = new InputStreamReader(urlconn.getInputStream());
BufferedReader bufferedReader = new BufferedReader(is);
String readLine = "";
while ((readLine = bufferedReader.readLine()) != null) {
result += readLine;
}
is.close();
urlconn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
public class PostHttp {
public static String RequstPostHttp(String strUrl) {
URL url = null;
String result="";
try {
url = new URL(strUrl);
HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setDoInput(true);// 设置输入流采用字节流模式
urlconn.setDoOutput(true);
urlconn.setRequestMethod("POST");
urlconn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlconn.setRequestProperty("Charset", "UTF-8");
urlconn.setConnectTimeout(10000);
urlconn.setReadTimeout(15000);
urlconn.connect();// 链接服务器并发送消息
OutputStream outStream = urlconn.getOutputStream();
outStream.flush();// 发送,清除缓存
outStream.close();// 关闭
// 开始接收返回的数据
InputStream is = urlconn.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String readLine = "";
while ((readLine = bufferedReader.readLine()) != null) {
result += readLine;
}
bufferedReader.close();
urlconn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
其实异步加载思路应该蛮清晰的,
public class PostHttp {
public static String RequstPostHttp(String strUrl) {
URL url = null;
String result="";
try {
url = new URL(strUrl);
HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setDoInput(true);// 设置输入流采用字节流模式
urlconn.setDoOutput(true);
urlconn.setRequestMethod("POST");
urlconn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlconn.setRequestProperty("Charset", "UTF-8");
urlconn.setConnectTimeout(10000);
urlconn.setReadTimeout(15000);
urlconn.connect();// 链接服务器并发送消息
OutputStream outStream = urlconn.getOutputStream();
outStream.flush();// 发送,清除缓存
outStream.close();// 关闭
// 开始接收返回的数据
InputStream is = urlconn.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String readLine = "";
while ((readLine = bufferedReader.readLine()) != null) {
result += readLine;
}
bufferedReader.close();
urlconn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
a.要准备开一个异步线程,当然在这之前你需要准备一个URL 和对返回值处理的数据结构
b.我觉得还是使用Gson解析复杂的json数据
c.在activity里面启动子线程,在handler里面对返回结果进行处理
下面的需要去弄清楚AsyncTask的原理le