第一个参数类型错误。找到:'com.example.sunshine.FetchData',需要:'android.content.Context'
Wrong 1st argument type. Found: 'com.example.sunshine.FetchData', required: 'android.content.Context'
我想这个问题更多的是关于理解上下文以及如何正确使用它。
在用谷歌搜索 "Whosebuged" 很多次后,我找不到答案。
问题:
使用 DateUtils.formatDateTime 时,我不能使用 "this" 作为上下文。错误信息如标题所述。
申请信息:
这是一个简单的天气应用程序,通过 JSON 检索天气信息并将其显示在屏幕上。
活动:
- MainActivity.java
- FetchData.java
MainActivity:显示信息
FetchData:从 API 获取 JSON 信息,对其进行格式化并将其发送回 MainActivity
我在 FetchData.java activity 中使用 DateUtils.formatDateTime 并且使用 "this" 作为上下文不起作用。
根据我的理解,上下文提供了调用方法的 "environment" (?) 。
- 为什么 FetchData 的 "environment" 无效?
- 应该提供什么内容?
非常感谢您的帮助。
谢谢:)
代码:
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;
}
编辑:我刚刚意识到我遗漏了一个重要的细节,即 activity 扩展 AsyncTask
。经过一些进一步的研究,显然你提供了上下文 bei 添加 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" 不起作用。
tempDate.formatDateTime(this,tempJSONWeatherData.getLong("dt"),你可以传递应用程序的上下文,而不是this,this指的是class FetchData
I am using DateUtils.formatDateTime in the FetchData.java activity and
using "this" as a context does not work. As from my understanding
Context provided the "environment" (?) of where the method is being
called.
你错了,上下文是 Android 上下文是 (from documentation):
Interface to global information about an application environment. This
is an abstract class whose implementation is provided by the Android
system. It allows access to application-specific resources and
classes, as well as up-calls for application-level operations such as
launching activities, broadcasting and receiving intents, etc.
DateUtils.formatDateTime()
需要 Context 作为其参数之一。所以,你需要传递一个上下文。
Android Activity
是 Context 的子 class,因此您可以使用 this
(引用自身)作为上下文,如下所示:
public class MyActivity extends Activity {
...
protected void doSomething() {
// this refer to the MyActivity instance which is a Context.
DateUtils.formatDateTime(this, ...);
}
...
}
您需要为每个 class 不是上下文子 class 的上下文传递上下文。
您不能在 AsyncTask 中使用 this
,因为它不是上下文子 class。因此,您需要使用 WeakReference
传递 Context 以避免 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(...);
我想这个问题更多的是关于理解上下文以及如何正确使用它。 在用谷歌搜索 "Whosebuged" 很多次后,我找不到答案。
问题:
使用 DateUtils.formatDateTime 时,我不能使用 "this" 作为上下文。错误信息如标题所述。
申请信息:
这是一个简单的天气应用程序,通过 JSON 检索天气信息并将其显示在屏幕上。
活动:
- MainActivity.java
- FetchData.java
MainActivity:显示信息
FetchData:从 API 获取 JSON 信息,对其进行格式化并将其发送回 MainActivity
我在 FetchData.java activity 中使用 DateUtils.formatDateTime 并且使用 "this" 作为上下文不起作用。 根据我的理解,上下文提供了调用方法的 "environment" (?) 。
- 为什么 FetchData 的 "environment" 无效?
- 应该提供什么内容?
非常感谢您的帮助。 谢谢:)
代码:
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;
}
编辑:我刚刚意识到我遗漏了一个重要的细节,即 activity 扩展 AsyncTask
。经过一些进一步的研究,显然你提供了上下文 bei 添加 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" 不起作用。
tempDate.formatDateTime(this,tempJSONWeatherData.getLong("dt"),你可以传递应用程序的上下文,而不是this,this指的是class FetchData
I am using DateUtils.formatDateTime in the FetchData.java activity and using "this" as a context does not work. As from my understanding Context provided the "environment" (?) of where the method is being called.
你错了,上下文是 Android 上下文是 (from documentation):
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
DateUtils.formatDateTime()
需要 Context 作为其参数之一。所以,你需要传递一个上下文。
Android Activity
是 Context 的子 class,因此您可以使用 this
(引用自身)作为上下文,如下所示:
public class MyActivity extends Activity {
...
protected void doSomething() {
// this refer to the MyActivity instance which is a Context.
DateUtils.formatDateTime(this, ...);
}
...
}
您需要为每个 class 不是上下文子 class 的上下文传递上下文。
您不能在 AsyncTask 中使用 this
,因为它不是上下文子 class。因此,您需要使用 WeakReference
传递 Context 以避免 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(...);