非Activity类调用getResources().openRawResource报错求助
解决非Activity类中调用
getResources()报错的问题 嘿,这个问题我太熟了!咱们先搞懂为啥会报错:getResources()是Context类的方法,而MainActivity本身就是Context的子类,所以在Activity里能直接调用没问题,但你的非Activity类(就是那个resources对象所属的类)没有持有Context实例,自然没法调用这个方法,这就是报错的核心原因。
接下来给你两种实用的解决方案,你可以根据自己的代码结构选:
方案一:给非Activity类传入Context实例
假设你的非Activity类叫ResourceReader,咱们先给它加个带Context参数的构造方法,让它持有Context引用:
public class ResourceReader { private Context mContext; // 构造方法接收Context public ResourceReader(Context context) { this.mContext = context; } public List<VDienas> readData() { // 这里用持有的mContext调用getResources() InputStream is = mContext.getResources().openRawResource(R.raw.your_resource_file); // 这里写你读取数据并转换成List<VDienas>的逻辑 // ... return vardadienasList; } }
然后回到MainActivity里,创建这个类的实例时传入this(因为Activity本身就是Context):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 传入MainActivity的Context创建实例 ResourceReader resources = new ResourceReader(this); vardadienas = resources.readData(); // 后续的业务逻辑... }
方案二:把读取方法改成静态工具方法(适合工具类场景)
如果你的resources是个工具类,那直接把readData改成静态方法,让方法接收Context参数更方便:
public class ResourceUtils { // 静态方法,直接传入Context public static List<VDienas> readData(Context context) { InputStream is = context.getResources().openRawResource(R.raw.your_resource_file); // 读取数据并转换的逻辑 // ... return vardadienasList; } }
然后在MainActivity里直接调用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vardadienas = ResourceUtils.readData(this); // ... }
小提醒
如果担心内存泄漏,建议使用ApplicationContext代替Activity的Context,比如把this换成getApplicationContext(),这样即使Activity被销毁,也不会因为持有引用导致内存泄漏哦~
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

