80,358
社区成员
发帖
与我相关
我的任务
分享
@Override
public void run() {
// 这是Service里面开启的线程
if (((BoCaiApplication)(getApplication())).getAcitivityFuncState()) {
BoCaiApplication application = ((BoCaiApplication)getApplication());
int oldGridX = application.getOldGridx();
int oldGridY = application.getOldGridy();
UserPositionItem item = application.getUserPositionItem();
// 用户跳出当前网格,则向服务器更新
if (/*!((oldGridX == item.gridX) && (oldGridY == item.gridY))*/true) {
try {
list = UserPositionService.getUserPositions(oldGridX, oldGridY, item);
Log.v("bug", "list 装载完毕");
// 判断人数是否足以发布活动
if (list != null) {
if (AutoPublishTool.canAutoPublish(list, item)) {
// 弹出对话框,询问是否发布聚集
if (((BoCaiApplication)(getApplication())).canDisplayPublishDialog()) {
handlerMsg.sendEmptyMessage(IMessage.OpenDialog);
}
}else {
Log.v("bug", "人数不足");
}
}else {
Log.v("bug", "list 为 空");
}
} catch (InterruptedException|ExecutionException|IOException e) {
Log.v("bug", "请求位置信息时,连接服务器超时(Position Service)");
handler.sendEmptyMessage(IMessage.Connect_server_Failed_Int);
}
}
}
if (isServiceRunning) {
handler.postDelayed(this, spanTime);
}
}
public class UserPositionService {
/**
* 向服务器更新位置信息并当前的网格 根据网格坐标,返回周围9个网格的用户位置(POST发请求)
*
* @param oldGridX
* 过时的网格坐标x
* @param oldGridY
* 过时的网格坐标y
* @param item
* 用户当前的位置信息
* @return 当前用户周围的用户位置信息的集合
*/
public static ArrayList<UserPositionItem> getUserPositions(int oldGridX,
int oldGridY, UserPositionItem item)
throws InterruptedException,
ExecutionException,IOException {
// 向服务器请求聚集信息
ExecutorService threadpool = Executors.newSingleThreadExecutor();
Future<ArrayList<UserPositionItem>> future = threadpool
.submit(new MyCallable(oldGridX, oldGridY, item));
Log.v("bug", "已发送请求");
return future.get();
}
private static class MyCallable implements
Callable<ArrayList<UserPositionItem>> {
private int oldGridX;
private int oldGridY;
private UserPositionItem item;
public MyCallable(int oldGridX, int oldGridY, UserPositionItem item) {
super();
this.oldGridX = oldGridX;
this.oldGridY = oldGridY;
this.item = item;
}
@Override
public ArrayList<UserPositionItem> call()
throws IOException {
return UserPositionService
.getUserPosition(oldGridX, oldGridY, item);
}
}
/**
* 向服务器更新位置信息并当前的网格 根据网格坐标,返回周围9个网格的用户位置(POST发请求)
*
* @param oldGridX
* 过时的网格坐标x
* @param oldGridY
* 过时的网格坐标y
* @param item
* 用户当前的位置信息
* @return 当前用户周围的用户位置信息的集合
* @throws IOException
*/
private static ArrayList<UserPositionItem> getUserPosition(int oldGridX,
int oldGridY, UserPositionItem item) throws IOException {
ArrayList<UserPositionItem> list;
String path = "http://" + ServerIp.localhost
+ ":8080/AndroidSever/UserPositionServlet";
try {
HttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(path);
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair(IPosition.Old_Grid_x,
oldGridX + ""));
parameters.add(new BasicNameValuePair(IPosition.Old_Grid_y,
oldGridY + ""));
parameters
.add(new BasicNameValuePair(IPosition.UserId, item.userId));
parameters.add(new BasicNameValuePair(IPosition.Grid_x, item.gridX
+ ""));
parameters.add(new BasicNameValuePair(IPosition.Grid_y, item.gridY
+ ""));
parameters.add(new BasicNameValuePair(IPosition.Latitude,
item.latitude + ""));
parameters.add(new BasicNameValuePair(IPosition.Longitude,
item.longitude + ""));
httpPost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8"));
//Represents a collection of HTTP protocol and framework parameters
HttpParams params = null;
params = client.getParams();
//set timeout
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 35000);
HttpResponse response = client.execute(httpPost);
int code = response.getStatusLine().getStatusCode();
Log.v("bug", "UserPositionService code = " + code);
// 连接成功,返回信息
if (code == 200) {
InputStream is = response.getEntity().getContent();
list = parseJSON(is);
return list;
} else {
Log.v("bug", "code !=200,list = null");
return null;
}
} catch (ConnectTimeoutException e) {
Log.v("bug", "ConnectTimeoutException 请求位置信息时,连接服务器超时(Service)");
throw e;
} catch (IOException e) {
Log.v("bug", "IOException 请求位置信息时,连接服务器超时(Service)");
return null;
} catch (Exception e) {
Log.v("bug", "Exception 请求位置信息时,连接服务器超时(Service)");
return null;
}
}
/**
* 将JSON格式的流转换为list对象集合
*
* @param is
* @return
* @throws Exception
*/
private static ArrayList<UserPositionItem> parseJSON(InputStream is)
throws Exception {
ArrayList<UserPositionItem> list = new ArrayList<UserPositionItem>();
UserPositionItem item = null;
// 将字符串转换为jsonarray格式
String data = StreamTools.streamToString(is);
JSONArray array = new JSONArray(data);
int length = array.length();
for (int i = 0; i < length; i++) {
JSONObject object = array.getJSONObject(i);
item = new UserPositionItem(object.getString(IPosition.UserId),
object.getInt(IPosition.Grid_x),
object.getInt(IPosition.Grid_y),
object.getDouble(IPosition.Latitude),
object.getDouble(IPosition.Longitude));
list.add(item);
}
return list;
}
}