为何直接用字符串正常,调用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)**来获取自己的资源,具体分两种情况:
- 如果你的AsyncTask是Activity的内部类:
// 在doInBackground方法中 JSONObject currentFilm = filmArray.getJSONObject(i); // 使用Activity的上下文获取应用资源 int voteCount = currentFilm.getInt(YourActivityName.this.getString(R.string.vote_count));
- 如果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
相关产品推荐
相关产品推荐

