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

时间:2015-02-06 10:02:05

标签: java android json static

嗨我的android项目是

  • 提供纬度和经度的GPSTracker.java类
  • 从adress API获取JSON的RemoteFetch.java类处于静态状态
  • MainActivity.java 但得到json的网址是这样的:

    private static final String OPEN_WEATHER_MAP_API =             " http://api.openweathermap.org/data/2.5/weather&#34?; +" 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());

2 个答案:

答案 0 :(得分:0)

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

编辑以获得进一步说明:

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

所以你要么:

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

  • 或者从toJSON方法中删除'static'关键字。请注意它是否在静态上下文的其他位置使用,因为它可能会抛出一个编译错误,说现在那些其他上下文无法看到该方法!

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

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

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

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

答案 1 :(得分:0)

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

根据您的代码,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

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

1.如果文件位于文件包之外,请确保在文件中import使用GPSTracker类(例如MainActicity.java)。

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