从嵌套的asynctask返回LatLng对象

时间:2017-01-31 18:57:08

标签: android sqlite google-maps android-asynctask

我花了好几天时间,但我找不到解决问题的方法:

我正在开发一个应用程序,用于检索显示用户选择的某部电影的影院列表,解析AsyncTask中的HTML页面。

我想在地图上用标记来显示那些影院,所以我需要坐标:一旦" GetCinemaList" AsyncTask完成后,我尝试在onPostExecute中填充我的markerList。

我有一个SQLite数据库,我在其中存储[theater | city | lat | lng]。所以我首先查看数据库,如果找不到,我想调用另一个AsyncTask从HTTP谷歌地理编码中检索坐标('导致设备地理编码器返回null,导致应用程序崩溃)

问题是我无法将LatLng点返回到第一个AsyncTask ...

我曾尝试使用侦听器并覆盖processFinish(LatLng p),但我无法将值赋给我的变量原因,从内部类访问它应该是最终的。

任何帮助/想法?谢谢!

这是我的Activity中的AsyncTasks的代码(包含错误)。

private class GetCinemaList extends AsyncTask<URL, Void, List<String>> {
    private Context mContext;


    public GetCinemaList(Context c){
        mContext = c;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected List<String> doInBackground(URL... urls) {
        List<String> cinemas = new ArrayList<>();
        Document docHTML = null;
        try {
            docHTML = QueryUtils.makeRequest(urls[0]);
            cinemas = QueryUtils.extractCinemasFromHTML(mTitile, docHTML);
        } catch (IOException e) {
            Log.e("JSwa", "Problem making request for parsing HTML "+e);
        }

        return cinemas;
    }

    @Override
    protected void onPostExecute(List<String> result) {
        super.onPostExecute(result);
        cinemaList = result;
        LatLng point;

        pointList = new ArrayList<>();
        for (String elem : cinemaList) {
            String name = elem.split("\t")[0];
            String orari = elem.split("\t")[1];

            Cursor cursor = queryDB(mCinemaDbR, city, name);
            if (!cursor.moveToFirst()) {
                // call geocoding service

                new LatLongFromService(name.concat(" " + city), new AsyncResponse() {
                    @Override
                    public void processFinish(LatLng output) {
                        point = output;
                    }
                }).execute();

                Log.d("JSwa", "Inserting point "+point.toString());

                // insert new value in the database
                long id = addCimena(mCinemaDbW, name, city, String.valueOf(point.latitude), String.valueOf(point.longitude));
                // insert new value in the list

                MarkerOptions marker = new MarkerOptions().position(point).title(name).snippet(orari);
                pointList.add(marker);
            }
            else{
                double lat = Double.parseDouble(cursor.getString(cursor.getColumnIndex(CinemaEntry.COLUMN_LAT)));
                double lng = Double.parseDouble(cursor.getString(cursor.getColumnIndex(CinemaEntry.COLUMN_LNG)));

                MarkerOptions marker = new MarkerOptions().position(new LatLng(lat,lng)).title(name)
                        .snippet(orari);
                pointList.add(marker);
            }
            cursor.close();
        }
        for (MarkerOptions marker : pointList){
            m_map.addMarker(marker);
        }

    }
}

//有时候设备会给出location = null

public class LatLongFromService extends AsyncTask<Void, Void, StringBuilder> {

    String place;
    public AsyncResponse delegate = null;

    public LatLongFromService(String place, AsyncResponse resp) {
        this.place = place;
        delegate = resp;
    }


    @Override
    protected StringBuilder doInBackground(Void... params) {

        try {
            HttpURLConnection conn = null;
            StringBuilder jsonResults = new StringBuilder();
            String googleMapUrl = "http://maps.googleapis.com/maps/api/geocode/json?address=" + this.place + "&sensor=false";

            URL url = new URL(googleMapUrl);
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(
                    conn.getInputStream());
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                jsonResults.append(buff, 0, read);
            }
            return jsonResults;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(StringBuilder result) {
        super.onPostExecute(result);
        try {
            JSONObject jsonObj = new JSONObject(result.toString());
            JSONArray resultJsonArray = jsonObj.getJSONArray("results");

            JSONObject location = resultJsonArray
                    .getJSONObject(0).getJSONObject("geometry").getJSONObject("location");

            String lat_helper = location.getString("lat");
            double lat = Double.valueOf(lat_helper);


            String lng_helper = location.getString("lng");
            double lng = Double.valueOf(lng_helper);

            delegate.processFinish(new LatLng(lat, lng));

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}`

0 个答案:

没有答案