我猜这个问题更多是关于理解上下文以及如何正确使用它。
谷歌搜索和“ stackoverflowed”很多后,我找不到答案。
问题:
使用DateUtils.formatDateTime时,不能使用“ this”作为上下文。错误消息如标题中所述。
应用信息:
这是一个简单的天气应用,可通过JSON检索天气信息并将其显示在屏幕上。
活动内容:
-MainActivity.java
-FetchData.java
MainActivity:显示信息
FetchData:从API获取JSON信息,对其进行格式化并将其发送回MainActivity
我在FetchData.java活动中使用DateUtils.formatDateTime,并且无法将“ this”用作上下文。
根据我的理解,上下文提供了在何处调用该方法的“环境”(?)。
为什么FetchData的“环境”无效?
应该提供什么内容呢?
非常感谢您的帮助。
谢谢 :)
码:
private ArrayList<String> getWeatherDataFromJson(String forecastJsontStr) throws JSONException {
ArrayList<String> dailyWeatherInfo = new ArrayList<>();
int dataCount;
DateUtils tempDate = new DateUtils();
JSONObject weatherData = new JSONObject(forecastJsontStr);
JSONArray threeHourWeatherData = weatherData.getJSONArray(JSON_LIST);
dataCount = weatherData.getInt("cnt");
JSONObject tempJSONWeatherData;
for (int i = 0; i < dataCount; i++) {
tempJSONWeatherData = threeHourWeatherData.getJSONObject(i);
tempDate.formatDateTime(this,tempJSONWeatherData.getLong("dt"),
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY |
DateUtils.FORMAT_ABBREV_ALL);
[more code here]
return dailyWeatherInfo;
}
编辑:我刚刚意识到我遗漏了一个重要的细节,即该活动扩展了
AsyncTask
。经过进一步研究后,您显然可以提供上下文,即先添加WeakReference
,然后在构造函数中添加上下文。我添加了以下代码:
private WeakReference<Context> contextWeakReference;
public FetchData (Content context) {
contextWeakReference = new WeakReference<>();
}
tempDate.formatDateTime(contextWeakReference.get(),tempJSONWeatherData.getLong("dt"),
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY |
DateUtils.FORMAT_ABBREV_ALL);
这使错误消失了,但是我仍然不明白为什么“ this”不起作用。
最佳答案
我在FetchData.java活动中使用DateUtils.formatDateTime和
使用“ this”作为上下文不起作用。据我了解
上下文提供了方法所在位置的“环境”(?)
叫。
您不正确,上下文是(from documentation)的Android上下文:
与有关应用程序环境的全局信息的接口。这个
是一个抽象类,其实现由Android提供
系统。它允许访问特定于应用程序的资源和
类,以及对应用程序级操作(例如,
开展活动,广播和接收意图等。DateUtils.formatDateTime()
需要将Context作为其参数之一。因此,您需要传递上下文。Android Activity
是Context的子类,因此您可以使用this
(指向自身)作为上下文,如下所示:
public class MyActivity extends Activity {
...
protected void doSomething() {
// this refer to the MyActivity instance which is a Context.
DateUtils.formatDateTime(this, ...);
}
...
}
您需要为不是Context子类的每个类传递Context。
您不能在AsyncTask中使用
this
,因为它不是上下文子类。因此,您需要使用WeakReference
传递上下文以避免Context leaking
,如下所示:private class AsyncTaskRunner extends AsyncTask<String, String, String> {
private WeakReference<Context> contextWeakReference;
public FetchData (Content context) {
contextWeakReference = new WeakReference<>();
}
private void doSomething() {
// We have the context from the WeakReference
Context context = contextWeakReference.get();
DateUtils.formatDateTime(context, ...);
}
}
最后,调用
DateUtils.formatDateTime()
时无需创建DateUtils对象,因此这不是必需的:DateUtils tempDate = new DateUtils();
tempDate.formatDateTime(...);
您可以直接调用它,因为它是静态方法:
DateUtils.formatDateTime(...);