Android Fragment应用崩溃:请求解决NullPointerException空指针异常
嘿,我看了你的报错信息和代码,问题很明确——你遇到的java.lang.NullPointerException是因为Fragmentone_view对象为null时,在子线程里调用了它的getWidth()方法。咱们来一步步修复这个问题:
问题根源分析
你在onViewCreated方法里尝试获取ID为container的View,但你的fragment_one.xml里对应的FrameLayout ID是大写C开头的Container,这就导致findViewById找不到对应的View,Fragmentone_view一直是null。之后当takeScreenShot()方法启动子线程调用Fragmentone_view.getWidth()时,自然就触发空指针异常了。
另外那个chromium的错误提示,大概率是WebView初始化时的上下文小问题,先解决空指针后再看是否还存在,当前主要崩溃原因是空指针。
修复步骤
1. 修正ID匹配错误
把onViewCreated里的查找ID改成和XML一致的R.id.Container:
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 这里的ID要和XML中的Container完全匹配(注意大写C) this.Fragmentone_view = view.findViewById(R.id.Container); }
2. 确保View初始化完成后再调用截图方法
即使ID改对了,也要保证takeScreenShot()是在View完全加载完成后才被调用。如果是外部触发这个方法,建议在onStart()或者onResume()生命周期之后执行,避免View还未初始化完成的情况。
3. 子线程中增加空指针判断(可选但推荐)
为了避免后续再出现类似问题,在子线程里先判断Fragmentone_view是否为空,再执行截图逻辑:
@Override public void takeScreenShot() { Thread threads = new Thread() { @Override public void run() { // 先检查View是否初始化完成,避免空指针 if (Fragmentone_view == null) { return; } Bitmap bitmap = Bitmap.createBitmap(Fragmentone_view.getWidth(), Fragmentone_view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Fragmentone_view.draw(canvas); FragmentOne.this.bitmap = bitmap; } }; threads.start(); }
按照上面的步骤修改后,空指针崩溃的问题应该就能解决了。如果之后还有chromium的错误,可以再检查WebView的初始化是否都在主线程执行,不过当前先解决核心的崩溃问题~
内容的提问来源于stack exchange,提问作者Abdeljalil.Kchih

