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

在全局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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:21