我有一个类扩展asynctask
private class taskMK extends AsyncTask<Void,Void,JSONObject>{
String url;
JSONObject json;
public taskMK(String tr){
this.url = tr;
}
@Override
protected JSONObject doInBackground(Void... params) {
JSONParser jsonParser = new JSONParser();
JSONObject json = jsonParser.getJSONFromURL(url);
return json;
}
@Override
protected void onPostExecute(JSONObject result) {
this.json = result;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
public JSONObject getkq(){
return this.json;
}
}
活动
String url = "https://maps.googleapis.com/maps/api/place/search/json?location="+lat+"%2C"+lng+"&name=atm&radius="+bk+"&sensor=false&key=AIzaSyCxaZYo1zJ_QxuNcp5dL5P0xm5XvIJPXRw";
taskMK mk = new taskMK(url);
mk.execute();
JSONObject json = mk.getkq();
我打算把这个代码放在asynctask类中,但是我得到错误“无法在没有调用Looper.prepare()的线程内创建处理程序”....实际上,我不知道该怎么做才解决这个问题
Double lat = loc.getLatitude();
Double lng = loc.getLongitude();
String url = "https://maps.googleapis.com/maps/api/place/search/json?location="+lat+"%2C"+lng+"&name=atm&radius="+bk+"&sensor=false&key=AIzaSyCxaZYo1zJ_QxuNcp5dL5P0xm5XvIJPXRw";
JSONParser jsonParser = new JSONParser();
JSONObject json = jsonParser.getJSONFromURL(url);
marker=getResources().getDrawable(R.drawable.hoe);
itemizedOverlay = new MarkerATM(marker, mapView);
int i=0;
try{
JSONArray array_atm = json.getJSONArray("results");
for(i=0;i<array_atm.length();i++){
JSONObject c = array_atm.getJSONObject(i);
String atm_name = c.getString("name");
String atm_address = c.getString("vicinity");
JSONObject geometry = c.getJSONObject("geometry");
JSONObject location = geometry.getJSONObject("location");
String atm_lat = location.getString("lat");
String atm_lng = location.getString("lng");
Double _lat = Double.parseDouble(atm_lat)*1E6;
Double _lng = Double.parseDouble(atm_lng)*1E6;
GeoPoint myPoint = new GeoPoint(_lat.intValue(), _lng.intValue());
OverlayItem overlayItem = new OverlayItem(myPoint, atm_name, atm_address);
itemizedOverlay.addOverlay(overlayItem);
}
} catch(JSONException e){
e.printStackTrace();
}
mapOverlays.add(itemizedOverlay);
我想从taskMK获取数据,但数据总是返回null ...怎么办我解决了我的问题:(对不起,我用英语不好。
答案 0 :(得分:4)
不是在getkq()
类中使用taskMK
,而是在执行asyncTask的activity类中有setkq()
。请使用以下内容:
private class taskMK extends AsyncTask<Void,Void,JSONObject>{
String url;
JSONObject json;
MyActivityClassObject obj;
public taskMK(String tr, MyActivityClassObject obj){
this.url = tr;
this.obj = obj;
}
@Override
protected JSONObject doInBackground(Void... params) {
JSONParser jsonParser = new JSONParser();
JSONObject json = jsonParser.getJSONFromURL(url);
return json;
}
@Override
protected void onPostExecute(JSONObject result) {
this.obj.setkq(result);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
在您的活动课程中,您可以拥有此功能:
public void setkq(JSONObject obj){
//Add your parsing logic here
}
答案 1 :(得分:0)
这是因为AsyncTask是一个Thread。它将自己做他的事情,当你调用JSONObject json = mk.getkq();
时,AsyncTask可能无法完成他的任务,从而返回空值。
根据您对文件的处理方式,您可能希望显示从JSON文件中解析的一些数据。如果您想以任何方式更改UI。您应该在onPostExecute()
答案 2 :(得分:0)
我没有使用AsyncTask,而是使用IntentService,向你想要的工作发送一个Intent来启动它,并在你完成后将Intent发送回你的Activity。