当前位置: 首页 > 知识库问答 >
问题:

从其他静态类获取值到json对象

冉伯寅
2023-03-14

嗨,我的android项目是

>

  • 一个GPSTracker.java类,给出纬度和经度
  • 从地址API获取JSON的远程etch.java类处于静态状态
  • 一个MainActivity.java但是获取json的url是这样的:

    私有静态最终字符串OPEN_WEATHER_MAP_API="http://api.openweathermap.org/data/2.5/weather?"q=%s

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

    因此,当我将它们添加到我的openweatherapi url中时,我就出现了错误:

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

    有没有办法将string/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();
        }
    

    在远程etch.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());
    
  • 共有2个答案

    巴宏恺
    2023-03-14

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

    编辑进一步解释:

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

    所以你要么:

    >

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

    或者从你的toJSON方法中删除“静态”关键字。如果它在静态上下文的其他地方被使用,要小心,因为它可能会抛出一个编译错误,说现在其他上下文看不到这个方法了!

    另外,你可能想看看Gsonhttps://sites.google.com/site/gson/gson-user-guide

    对错误的SO响应,阅读并尝试理解它的工作原理:"非静态方法不能从静态上下文中引用"错误

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

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

  • 林俊英
    2023-03-14

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

    因为根据你的代码,纬度和经度在GPSTracker中,不是静态的(这些是实例变量),所以你得到了错误。

    为了解决问题,您需要实例化类的实例(创建一个对象),以便运行时可以为实例保留内存,并允许您访问实例变量(在您的情况下,纬度和经度在GPSTracker中)。

    尝试下面的代码,你想访问纬度和经度中的GPSTracker(在onCreate()中的MainActive为例)

    GPSTracker obj=new GPSTracker();

    要访问实例变量纬度和经度,请使用obj如下obj。纬度obj。经度

    以上2点需要考虑的事项:
    BR> 1。如果文件不在文件包内,请确保将
    GPSTracker类导入到要使用它的文件中(例如mainacitity.java)2。如果GPSTracker类定义了其他一些构造函数,您需要在创建对象时调用该构造函数。

     类似资料:
    • 我有一个名为AnimalsData的文件,它有一个由数组组成的对象。数组由一个对象和另一个数组组成。它看起来像这样: 我的HTML文件如下所示: 我正试图获取的值的类名对象从动画类数组。我一直在使用以下两个stackoverflow页面作为指南: 访问JSON数组中的对象和访问/处理(嵌套)对象、数组或JSON 我有另一个javascript文件,其中包含以下内容: 编辑我将for in循环中的"

    • 问题内容: 我正在做作业,遇到了一些错误。在一个类中,我有此方法: 现在,我收到错误消息“无法从静态上下文中引用非静态方法…”,因此我将getPoints()设置为静态方法,并将变量也设置为静态,并且它可以正常工作。但是在另一种打印对象的方法中,它不起作用(我相信是由于static关键字)。 所以我的问题是,有没有一种方法可以在不创建第二个Class实例的情况下调用方法?这是我所拥有的一般构想代码

    • 现在我得到错误“non-static method conly be referenced from a static context...”,所以我将getPoints()设置为静态方法,同时将变量设置为静态,这样就可以工作了。但是在另一个打印对象的方法中,它就不起作用了(我相信这是因为static关键字的缘故)。 那么我的问题是,在所有这些之后,有没有一种方法可以调用一个方法,而不创建第二个类

    • 我有两个json对象,请不要是字符串,我想将它们组合成一个json对象,如下所示。 两个对象: 预期结果: 有没有一种优雅的方法可以做到这一点?我的意思是,不提取每支笔和每本书的值,然后使用以下方法将它们重新插入包 我正在使用org。科德豪斯。抛弃json。JSONObject,如果需要该信息。

    • 我正在尝试一个为超类学生提供2个私有成员名和ID的练习。提供了两个方法,即public int ShowID()和public String ShowName(),后者将返回两个值。 子类还包含2个私有成员类和2个来自超类私有成员的类号 我的任务是为他们写一个数组并打印出来,创建数组调用std[]后,我不能打印name和ID的值,因为它是私有成员,也不能从superclass方法中获取值,因为它是

    • } 我想从这个json对象中获取值。 我在下面试过了,但没有成功。