【问题标题】:How to call the value of variables from one class to another in Java (Android)如何在Java(Android)中将变量的值从一个类调用到另一个类
【发布时间】:2016-08-07 09:25:20
【问题描述】:

这是我的代码。我想将latlog 变量的值从JSONTask 调用为onMapReady

public class JSONTask extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line ="";
            while ((line = reader.readLine()) != null){
                buffer.append(line);
            }

            String finalJson = buffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);

            // JSONObject finalObject = parentObject.getJSONObject();

            String latitude = parentObject.getString("geo");
            String[] coordinate = latitude.split(",");

            double lat = Double.parseDouble(coordinate[0]);

            double log = Double.parseDouble(coordinate[1]);

            return lat + " - " + log ;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if(connection != null) {
                connection.disconnect();
            }
            try {
                if(reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        tvData.setText(result);
    }
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(lat,log);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

【问题讨论】:

    标签: java android google-maps oop geolocation


    【解决方案1】:

    您可以按照以下代码创建监听器接口

    在获取经纬度之前,最好等待地图准备好。等等onMapReady,你可以执行你的 AsyncTask,一旦你得到结果,你可以调用addLatLng 来添加标记

    public class JSONTask extends AsyncTask<String, Void, LatLng> {
    
        interface OnLatLngReceivedListener {
            void onLatLngReceived(LatLng latLng);
        }
    
        private OnLatLngReceivedListener listener;
    
        public JsonTask(OnLatLngReceivedListener listener) {
            this.listener = listener;
        }
    
        @Override
        protected LatLng doInBackground(String... params) {
            HttpURLConnection connection = null;
            BufferedReader reader = null;
    
            try {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
    
                InputStream stream = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(stream));
    
                StringBuffer buffer = new StringBuffer();
                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
    
                JSONObject parentObject = new JSONObject(buffer.toString());
                String latitude = parentObject.getString("geo");
                String[] coordinate = latitude.split(",");
    
                double lat = Double.parseDouble(coordinate[0]);
                double log = Double.parseDouble(coordinate[1]);
                return new LatLng(lat, log);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(LatLng latLng) {
            if (latLng != null && listener != null) {
                listener.onLatLngReceived(latLng);
            } else {
                // SOME FAILING REPORT MECHANISM
            }
        }
    }
    

    在你的活动/片段中

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        new JsonTask(new JsonTask.OnLatLngReceivedListener() {
            @Override
            public void onLatLngReceived(LatLng latLng) {
                addLatLng(latLng);
            }
        }).execute("YOUR_JSON_URL");
    }
    
    private void addLatLng(LatLng latLng) {
        // Add a marker in Sydney and move the camera
        mMap.addMarker(new MarkerOptions().position(latLng).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    }
    

    注意:您可能需要编写一些逻辑以避免多次添加相同的标记。

    【讨论】:

      【解决方案2】:

      尝试将 lat 和 long 变量定义为全局变量。

      【讨论】:

        【解决方案3】:

        首先,当您调用onMapReady() 方法时,AsyncTask 可能还没有完成。
        你应该检查这个,例如(lat != 0 &amp;&amp; lon !=)

        那么,问题出在哪里?
        在你的班级宣布变量lat, lon
        并且,在onPostExecute() 中解析你的Stringsplit(" - ") - 它会给你String array 两个项目,然后让lat = Double.parseDouble(yourArray[0])lon = Double.parseDouble(yourArray[1]) 得到lat 和lon。

        【讨论】:

          【解决方案4】:

          我对此类任务使用共享偏好, 顺便说一句,这是某种黑客行为。

          【讨论】:

            猜你喜欢
            • 2013-12-01
            • 2021-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多