第一个参数类型错误。找到:“ com.example.sunshine.FetchData”,必需:“ android.content.Context”

时间:2019-02-23 03:06:11

标签: java android android-context android-dateutils

我猜这个问题更多是关于理解上下文以及如何正确使用它。 谷歌搜索并“ stackoverflowed”很多后,我找不到答案。

问题:
使用DateUtils.formatDateTime时,不能使用“ this”作为上下文。错误消息如标题中所述。

应用信息:
这是一个简单的天气应用,可通过JSON检索天气信息并将其显示在屏幕上。

活动:
-MainActivity.java
-FetchData.java

MainActivity:显示信息
FetchData:从API获取JSON信息,对其进行格式化并将其发送回MainActivity

我在FetchData.java活动中使用DateUtils.formatDateTime,并且将“ this”用作上下文不起作用。 根据我的理解,上下文提供了在何处调用该方法的“环境”(?)。

  1. 为什么FetchData的“环境”无效?
  2. 应该提供什么内容?

非常感谢您的帮助。 谢谢:)

代码:

    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”不起作用。

2 个答案:

答案 0 :(得分:1)

  

我在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以避免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(...);

答案 1 :(得分:0)

tempDate.formatDateTime(this,tempJSONWeatherData.getLong(“ dt”),而不是您可以传递应用程序上下文,而是引用类FetchData