You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何直接用字符串正常,调用Resources.getSystem().getString在AsyncTask报错?

问题原因与解决方案

嘿,我来帮你理清这个问题!问题的核心出在你用的Resources.getSystem()这个方法上——它根本不是用来获取你自己应用里的字符串资源的!

为什么会抛出异常?

Resources.getSystem()获取的是Android系统自带的全局资源,而你在strings.xml里定义的R.string.vote_count是属于你自己应用的私有资源。用系统资源对象去访问应用内部的资源,要么会返回错误的字符串(甚至是空值),要么直接找不到对应的资源ID,导致你实际传给getInt()的参数根本不是JSON里的"vote_count"键,自然就触发了JSONException: No value for ...的异常。

而你第一种写法直接硬编码"vote_count",和JSON数据里的键完全匹配,所以能正常运行。

正确的做法

你需要用**当前应用的上下文(Context)**来获取自己的资源,具体分两种情况:

  1. 如果你的AsyncTask是Activity的内部类:
// 在doInBackground方法中
JSONObject currentFilm = filmArray.getJSONObject(i);
// 使用Activity的上下文获取应用资源
int voteCount = currentFilm.getInt(YourActivityName.this.getString(R.string.vote_count));
  1. 如果AsyncTask是独立的类:
    先把Context作为参数传入AsyncTask,再用它获取资源(建议用ApplicationContext避免内存泄漏):
public class FetchFilmsTask extends AsyncTask<Void, Void, List<Film>> {
    private Context mAppContext;

    // 构造方法传入上下文
    public FetchFilmsTask(Context context) {
        mAppContext = context.getApplicationContext();
    }

    @Override
    protected List<Film> doInBackground(Void... params) {
        // ...其他网络请求或JSON解析代码
        JSONObject currentFilm = filmArray.getJSONObject(i);
        int voteCount = currentFilm.getInt(mAppContext.getString(R.string.vote_count));
        // ...后续处理
        return filmsList;
    }
}

关键提醒

永远不要用Resources.getSystem()访问自己应用的资源,这个方法仅适用于获取Android系统原生提供的资源(比如系统默认的提示文本、系统图标等)。

内容的提问来源于stack exchange,提问作者Indy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:52