【问题标题】:Re-inflating view in handler.post when getView() is null当 getView() 为 null 时在 handler.post 中重新填充视图
【发布时间】:2023-02-07 04:20:50
【问题描述】:

我最近用处理程序和 newSingleThreadExecutors 替换了我的应用程序中所有已弃用的 AsyncTask 代码。从远程服务器检索响应数据后,我在代码的 handler.post 部分更新了 UI。

我个人从来没有能够重现任何问题,但在某些真实条件下的某些设备(主要是 oppo、redmi、vivo 等)上,getView() 返回 null 并且我的权宜之计尝试重新膨胀视图失败。崩溃次数增加了很多:

异常 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”

我的代码的粗略概述:

public class ResultFragment extends Fragment {
 .....
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.result, container, false);
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        assert bundle != null;
        String query_url = bundle.getString("query_url");
        send_request(query_url);
    }

    void send_request(String... urls) {
        Handler handler = new Handler(Looper.getMainLooper());
        Executors.newSingleThreadExecutor().execute(() -> {
        .....
            handler.post(() -> {
                context = getContext();

                final TextView mTextView;
                final WebView mWebView;

                if (getView() != null) {
                    mTextView = getView().findViewById(R.id.count);
                    mWebView = getView().findViewById(R.id.result);
                } else {
                    View view = LayoutInflater.from(context).inflate(R.layout.result, null); <-- crash
                    mTextView = view.findViewById(R.id.count);
                    mWebView = view.findViewById(R.id.result);
                }

我从生命周期文档中了解到,我应该能够使用此代码获取视图。而且我确实明白,尝试像这样重新膨胀代码是一个危险的提议(可能会发生崩溃!)。但是当 getView() 返回 null 时我该怎么做呢?

正如我所说,我从未能够重现这些崩溃。所以我愿意尝试任何可能有效的方法。

对于一般信息,我的目标是 sdk 版本 33。

【问题讨论】:

    标签: android handler layout-inflater getview


    【解决方案1】:

    你根本不会这样做。如果您没有视图,重新膨胀它不会达到您的预期。它充其量会创建一组新的视图,这些视图仅在内存中而不显示在屏幕上。换句话说,这将毫无意义。

    另外,那不是你的问题。你的问题是语境一片空白。您的片段未附加到任何片段。在这种情况下,您可能想要做的是更新任何持久状态(如果有)并跳过更新 UI。

    此外,如果您通常在执行器上扩展您的 UI,然后发布到处理程序 - 停止。这不是它的工作原理。通货膨胀应该发生在 onCreateView 函数中。你可以像那样填写视图,但你会绝不像那样给它们充气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2019-11-21
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多