繁体   English   中英

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

[英]Wrong 1st argument type. Found: 'com.example.sunshine.FetchData', required: 'android.content.Context'

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

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

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

活动:
- MainActivity.java
- 获取数据.java

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

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

  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);

这使错误消失,但我仍然不明白为什么“这个”不起作用。

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

你错了, Context 是 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 ,因为它不是 Context 子类。 因此,您需要使用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(...);

tempDate.formatDateTime(this,tempJSONWeatherData.getLong("dt"), 而不是 this 你可以传递应用程序的上下文,这指的是类 FetchData

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM