在全局Runnable中使用Glide无法调用getActivity,该使用何种上下文?
解决Runnable中Glide无法使用getActivity作为上下文的问题
这个问题的核心是匿名Runnable内部类里的this指向的是Runnable实例,而不是你的Fragment,所以直接写this.getActivity()肯定会报错。给你几个靠谱的解决办法,结合你的代码来调整:
方案1:提前把上下文存成全局变量
在你的Fragment类里声明一个全局Context变量,在onViewCreated里初始化它,之后Runnable里直接用这个变量就行:
public class YourFragment extends Fragment { private Context mFragmentContext; private ImageView image; private Handler handler; private Runnable runnable; // 其他全局变量... @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); image = view.findViewById(R.id.your_image_id); // 假设你在这里初始化ImageView mFragmentContext = getActivity(); // 也可以用view.getContext(),更安全 // 初始化handler和runnable runnable = new Runnable() { @Override public void run() { if(!isNetworkConnected()) { handler.postDelayed(runnable , time); } else { // 你的JSON解析逻辑... try { Glide.with(mFragmentContext) .load(jsonObject.getString("dispensary_thumbmail")) .into(image); } catch (JSONException e) { e.printStackTrace(); } } } }; } }
方案2:用Fragment类名.this获取实例
如果不想额外存变量,直接用YourFragment.this拿到Fragment本身,再调用getActivity(),记得做空判断避免空指针:
try { Context context = YourFragment.this.getActivity(); if(context != null) { Glide.with(context) .load(jsonObject.getString("dispensary_thumbmail")) .into(image); } } catch (JSONException e) { e.printStackTrace(); }
方案3:直接用ImageView的上下文
Glide支持传入View的上下文,你的image是全局可访问的,直接用image.getContext()最稳妥,还能降低内存泄漏风险:
try { Glide.with(image.getContext()) .load(jsonObject.getString("dispensary_thumbmail")) .into(image); } catch (JSONException e) { e.printStackTrace(); }
额外提醒
- 防内存泄漏:因为你的Runnable是全局的,记得在Fragment的
onDestroyView或onDestroy里移除Handler回调:handler.removeCallbacks(runnable);,避免Fragment销毁后还被引用。 - 空安全:不管用哪种方式,最好都对Context做空判断,防止Fragment已经脱离Activity时出现异常。
内容的提问来源于stack exchange,提问作者Andrei Nechita
相关产品推荐
相关产品推荐

