Android 如何将字符串从OnPostExecute提取到我的主活动

Android 如何将字符串从OnPostExecute提取到我的主活动,android,google-maps,Android,Google Maps,我仍然是新的,我重复一遍,在android studio中是新的,我尝试使用listview显示地名、附近地区、纬度和经度。我已经准备好listview,但无法从OnPostExecute获取字符串。我试着用这个,但它根本不起作用,或者我做得不对。我希望任何人都能帮助我,或者告诉我从OnPostExecute获取字符串和双精度的正确方法 public class PlacesDisplayTask extends AsyncTask<Object, Integer, List<Ha

我仍然是新的,我重复一遍,在android studio中是新的,我尝试使用listview显示地名、附近地区、纬度和经度。我已经准备好listview,但无法从OnPostExecute获取字符串。我试着用这个,但它根本不起作用,或者我做得不对。我希望任何人都能帮助我,或者告诉我从OnPostExecute获取字符串和双精度的正确方法

public class PlacesDisplayTask extends AsyncTask<Object, Integer,
 List<HashMap<String,String>>> {


    JSONObject googlePlacesJson;
    GoogleMap googleMap;

    @Override
    public List<HashMap<String, String>> doInBackground(Object... inputObj) {

        List<HashMap<String, String>> googlePlacesList = null;
        Places placeJsonParser = new Places();

        try {
            googleMap = (GoogleMap) inputObj[0];
            googlePlacesJson = new JSONObject((String) inputObj[1]);
            googlePlacesList = placeJsonParser.parse(googlePlacesJson);
        } catch (Exception e) {
            Log.d("Exception", e.toString());
        }

        return googlePlacesList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String,String>> list) {

        for (int i = 0; i < 3; i++) {

            HashMap<String, String> googlePlace = list.get(i);
            double lat = Double.parseDouble(googlePlace.get("lat"));
            double lng = Double.parseDouble(googlePlace.get("lng"));
            String placeName = googlePlace.get("place_name");
            String vicinity = googlePlace.get("vicinity");

        }
    }
}
公共类位置显示任务扩展异步任务{
JSONObject googlePlacesJson;
谷歌地图谷歌地图;
@凌驾
公共列表doInBackground(对象…inputObj){
列表googlePlacesList=null;
Places placeJsonParser=new Places();
试一试{
googleMap=(googleMap)inputObj[0];
googlePlacesJson=新的JSONObject((字符串)inputObject[1]);
googlePlacesList=placeJsonParser.parse(googlePlacesJson);
}捕获(例外e){
Log.d(“异常”,例如toString());
}
返回谷歌PlacesList;
}
@凌驾
受保护的void onPostExecute(列表){
对于(int i=0;i<3;i++){
HashMap googlePlace=list.get(i);
double-lat=double.parseDouble(googlePlace.get(“lat”));
double lng=double.parseDouble(googlePlace.get(“lng”));
String placeName=googlePlace.get(“place_name”);
String neighborary=googlePlace.get(“neighborary”);
}
}
}

完成您要做的事情的一种不那么繁琐的方法是执行任何需要在
onPostExecute()中返回值的任务。
。您可以使用构造函数输入大多数引用,如上下文,并将它们存储为全局变量以供使用

另一种方法是将类签名中的返回类型设置为List,您可以调用
.execute().get()
方法。但这将使后台进程同步,即它将阻塞UI线程,等待结果


我能想到的最后一种选择是使用您已经发布的链接中所述的委托。

使用如下界面

public class PlacesDisplayTask extends AsyncTask<Object, Integer,
    List<HashMap<String,String>>> {

    public AsyncResponse delegate = null;
    JSONObject googlePlacesJson;
    GoogleMap googleMap;

    @Override
    public List<HashMap<String, String>> doInBackground(Object... inputObj) {

        List<HashMap<String, String>> googlePlacesList = null;
        Places placeJsonParser = new Places();

        try {
            googleMap = (GoogleMap) inputObj[0];
            googlePlacesJson = new JSONObject((String) inputObj[1]);
            googlePlacesList = placeJsonParser.parse(googlePlacesJson);
        } catch (Exception e) {
            Log.d("Exception", e.toString());
        }

        return googlePlacesList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String,String>> list) {
        delegate.processFinish(list);
    }
}
public interface AsyncResponse {
    void processFinish(List<HashMap<String,String>> list);
}
公共类位置显示任务扩展异步任务{
公共异步响应委托=null;
JSONObject googlePlacesJson;
谷歌地图谷歌地图;
@凌驾
公共列表doInBackground(对象…inputObj){
列表googlePlacesList=null;
Places placeJsonParser=new Places();
试一试{
googleMap=(googleMap)inputObj[0];
googlePlacesJson=新的JSONObject((字符串)inputObject[1]);
googlePlacesList=placeJsonParser.parse(googlePlacesJson);
}捕获(例外e){
Log.d(“异常”,例如toString());
}
返回谷歌PlacesList;
}
@凌驾
受保护的void onPostExecute(列表){
委托.进程完成(列表);
}
}
您的活动应该通过实现接口的方法来处理响应

public class MainActivity implements AsyncResponse{
  PlacesDisplayTask asyncTask =new PlacesDisplayTask ();

  @Override
  public void onCreate(Bundle savedInstanceState) {

     //this to set delegate/listener back to this class
     asyncTask.delegate = this;

     //execute the async task 
     asyncTask.execute();
  }

  //this override the implemented method from asyncTask
  void processFinish(List<HashMap<String,String>> list){
     //Here you will receive the result fired from async class 
     //of onPostExecute(result) method.
     for (int i = 0; i < 3; i++) {

         HashMap<String, String> googlePlace = list.get(i);
         double lat = Double.parseDouble(googlePlace.get("lat"));
         double lng = Double.parseDouble(googlePlace.get("lng"));
         String placeName = googlePlace.get("place_name");
         String vicinity = googlePlace.get("vicinity");

      }
    }
 }
public类MainActivity实现异步响应{
PlacesDisplayTask asyncTask=新PlacesDisplayTask();
@凌驾
创建时的公共void(Bundle savedInstanceState){
//此选项用于将委托/侦听器设置回此类
asyncTask.delegate=这个;
//执行异步任务
asyncTask.execute();
}
//这将重写asyncTask中实现的方法
void processFinish(列表){
//在这里,您将收到从异步类激发的结果
//onPostExecute(结果)方法的。
对于(int i=0;i<3;i++){
HashMap googlePlace=list.get(i);
double-lat=double.parseDouble(googlePlace.get(“lat”));
double lng=double.parseDouble(googlePlace.get(“lng”));
String placeName=googlePlace.get(“place_name”);
String neighborary=googlePlace.get(“neighborary”);
}
}
}
创建这样一个接口

public class PlacesDisplayTask extends AsyncTask<Object, Integer,
    List<HashMap<String,String>>> {

    public AsyncResponse delegate = null;
    JSONObject googlePlacesJson;
    GoogleMap googleMap;

    @Override
    public List<HashMap<String, String>> doInBackground(Object... inputObj) {

        List<HashMap<String, String>> googlePlacesList = null;
        Places placeJsonParser = new Places();

        try {
            googleMap = (GoogleMap) inputObj[0];
            googlePlacesJson = new JSONObject((String) inputObj[1]);
            googlePlacesList = placeJsonParser.parse(googlePlacesJson);
        } catch (Exception e) {
            Log.d("Exception", e.toString());
        }

        return googlePlacesList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String,String>> list) {
        delegate.processFinish(list);
    }
}
public interface AsyncResponse {
    void processFinish(List<HashMap<String,String>> list);
}
公共接口异步响应{
作废处理完成(列表);
}

PlacesDisplayTask
类是内部类、活动还是单独的类?@ρ∑ѕρєK内部类使用
interface
创建自定义侦听器,或者将代码从
onCreate
移动到
onPostExecute
,在其中要使用值可以向我展示如何实现接口的使用。我非常确定这项工作绝对很好@ρ∑ѕρєK我试图通过在onPostExecute,
myDb.insertHospital(placeName,neighboration,lat,lng)插入代码,将其中的4个值插入数据库中的一个表中但它得到了一个错误java.lang.NullPointerException。它在modularsoft.anaccident.NearbyFragment.processFinish(NearbyFragment.java:121)处返回java.lang.NullPointerException在modularsoft.anaccident.NearbyFragment$PlacesDisplayTask.onPostExecute(NearbyFragment.java:321)在modularsoft.anaccident.NearbyFragment$PlacesDisplayTask.onPostExecute(NearbyFragment.java:296)处