【问题标题】:get value from other static class to json object从其他静态类获取值到 json 对象
【发布时间】:2015-02-06 10:02:04
【问题描述】:

嗨,我的 android 项目是

  • 提供纬度和经度的 GPSTracker.java 类
  • 从地址 API 获取 JSON 的 RemoteFetch.java 类处于静态状态
  • 一个 MainActivity.java 但是获取 json 的 url 是这样的:

    私有静态最终字符串 OPEN_WEATHER_MAP_API = “http://api.openweathermap.org/data/2.5/weather?” + "q=%s&" +"lat="+"&lon=" + "&units=metric";

我的纬度和经度在 GPSTracker 中,但是当我获取它们时,它不会让我获取这些值,因为它们不是静态格式...

所以一旦我将它们添加到我的 openweatherapi 网址中,我就会遇到错误:

“不能从静态上下文引用非静态字段”。

有没有办法将字符串/int 格式“转换”为静态格式??

如果您需要更多信息,请告诉我。

这里有一些代码

private void updateWeatherData(final String city){
        new Thread(){
            public void run(){

                final  JSONObject json = RemoteFetch.getJSON(MainActivity.this,city);
                if(json == null){
                    handler.post(new Runnable(){
                        public void run(){
                          Toast.makeText(MainActivity.this.getApplicationContext(),R.string.place_not_found,Toast.LENGTH_LONG).show();
                        }
                    });
                } else {
                    handler.post(new Runnable(){
                        public void run(){
                            renderWeather(json);
                        }
                    });
                }
            }
        }.start();
    }

在 RemoteFetch.java 中

 private static final String OPEN_WEATHER_MAP_API =
            "http://api.openweathermap.org/data/2.5/weather?" + "q=%s&" +"lat="+"&lon=" + "&units=metric";
    public static JSONObject getJSON(Context context, String city){
        try {
          //  gps.getLatitude();
            URL url = new URL(String.format(OPEN_WEATHER_MAP_API, city));
            HttpURLConnection connection =
                    (HttpURLConnection)url.openConnection();

            connection.addRequestProperty("x-api-key", 
                    context.getString(R.string.open_weather_maps_app_id));

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));

            StringBuffer json = new StringBuffer(1024);
            String tmp="";
            while((tmp=reader.readLine())!=null)
                json.append(tmp).append("\n");
            reader.close();


            JSONObject data = new JSONObject(json.toString());

【问题讨论】:

  • 你能把你的 GPSTracker 类获取坐标的方法改成静态的吗?

标签: java android json static


【解决方案1】:

您必须了解类和该类的实例之间的区别。静态字段和方法连接到类本身而不是它的实例。

由于根据您的代码,latitude and longitude are in the GPSTracker 不是静态的,(这些是实例变量)您会收到错误消息。

要解决您的问题,您需要实例化您的类的一个实例(创建一个对象),以便运行时可以为该实例保留内存并允许您访问实例变量(在您的情况下为latitude and longitude are in the GPSTracker)。

在 GPSTracker 中您想要访问 latitude and longitude 的位置尝试以下代码(例如在 MainActivity 的 onCreate() 中)

GPSTracker obj = new GPSTracker();

要访问实例变量纬度和经度,请使用obj,如下所示 obj.latitudeobj.longitude

上述工作需要考虑的其他 2 点:

1. 确保 import GPSTracker 类在您想要使用它的文件中(例如 MainActicity.java),如果它在您的文件包之外。

2. 如果 GPSTracker 类定义了其他构造函数,您要使用,您需要在创建对象时调用该构造函数。

【讨论】:

  • 在 RemoteFetch.java 中使纬度和经度可用的唯一方法是将 GPSTracker gpsTracker = new GPSTracker(this);在 onCreate 但因为 RemoteFetch 不是 Activity...
  • 没关系,我需要一种能够将这些值(现在我已经有了)提供给 json api url 的方法,因为只要我将“+ latitude”添加到我的 json url 我得到 ""Non static field cannot be referenced from a static context" 。" 但是我不能使 getJSON 方法成为非静态的,因为我会得到这个错误:"Error:(147, 53) error: non-static method getJSON(Context,String) 不能从静态上下文中引用”在“final JSONObject json = RemoteFetch.getJSON(MainActivity.this,city);”行这来自我的 MainActivity.java
【解决方案2】:

您正在尝试访问不在您范围内的内容(也称为上下文,但就语言而言,不要将其与类 Context 混淆)。所以你要么需要将你的变量作为参数传递给静态方法,要么制作方法和实例方法(删除静态)。

编辑进一步解释:

在您的代码的某些部分(我想这不是您粘贴的部分),您正在使用一个属性。在您的静态方法中,您看不到该属性。 “静态”意味着无论它是什么,它都存在于类中,而非静态的东西属于该类的实例。虽然代码在您编写时似乎在同一个地方,但在运行时它不会在同一个地方。这就是为什么当您在静态上下文(即静态方法内部)上做某事时,您无法从实例中看到属性。

所以你要么:

  • 将其作为参数传递,就像您对其他两个(上下文和城市)所做的那样,

  • 或者从 toJSON 方法中删除“静态”关键字。请注意它是否在静态上下文的其他地方使用,因为它可能会引发编译错误,说明现在那些其他上下文无法看到该方法!

另外,您可能想查看 Gson https://sites.google.com/site/gson/gson-user-guide

对您的错误的 SO 响应,阅读并尝试了解其工作原理:"Non-static method cannot be referenced from a static context" error

还有一些关于班级成员的文档http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

我建议您复习基本的 OOP 概念,因为您遇到的这个错误是一个非常基本的错误。

【讨论】:

  • 感谢您的回答,我真的不知道该怎么做,获取json的方法是这样的: public static JSONObject getJSON(Context context, String city){ try { URL url = 新 URL(String.format(OPEN_WEATHER_MAP_API, 城市));所以,我必须在字符串城市之后添加一些东西,比如双纬度?如果我删除静态我有“非静态方法“getJSON ...”不能从静态上下文中引用
  • 我用更详细的解释和链接编辑了我的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多