嗨我的android项目是
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());
答案 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.latitude
或obj.longitude
。
上述工作要考虑的其他两点:
1.如果文件位于文件包之外,请确保在文件中import
使用GPSTracker类(例如MainActicity.java)。
2.如果GPSTracker类定义了一些您想要使用的构造函数,则需要在创建对象时调用该构造函数。