java - "Only the original thread that created a view hierarchy can touch its views. "如何解决我的情况下的崩溃?

标签 java android class android-studio android-fragments

我遇到以下问题。

我在 Class1 中有一个 RewardedVideoListener,并且希望在 Class2 中立即创建一些 View INVISIBLE播放奖励视频。

问题是我收到以下错误:

2019-10-20 22:13:48.336 13565-13587/com.myapp.nameE/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.fujigames.memesoundboard, PID: 13565
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855)
        at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1075)
        at android.view.ViewGroup.invalidateChild(ViewGroup.java:5242)
        at android.view.View.invalidateInternal(View.java:13574)
        at android.view.View.invalidate(View.java:13538)
        at android.view.View.setFlags(View.java:11447)
        at android.view.View.setVisibility(View.java:8001)
        at com.myapp.name.MainActivity.onRewardedVideoAdRewarded(MainActivity.java:449)
        at com.ironsource.mediationsdk.sdk.ListenersWrapper$7.run(ListenersWrapper.java:198)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at com.ironsource.mediationsdk.sdk.ListenersWrapper$CallbackHandlerThread.run(ListenersWrapper.java:499)

这是Class1中的方法,当奖励视频刚刚结束时调用:

@Override
public void onRewardedVideoAdRewarded(Placement placement) {
    Class2 cl2 = new Class2();

    cl2.greyBackgroundcl2 = (ImageView) findViewById(R.id.greyBackgroundcl2);
    cl2.adtextcl2 = (TextView)findViewById(R.id.adtextcl2);
    cl2.showcl2 = (Button) findViewById(R.id.showVideocl2);

    cl2.showcl2.setVisibility(View.INVISIBLE);
    cl2.greyBackgroundcl2.setVisibility(View.INVISIBLE);
    cl2.adtextcl2.setVisibility(View.INVISIBLE);
}

这是Class2(一个 fragment )

public class Class2 extends Fragment {

    public Button showcl2;
    public ImageView greyBackgroundcl2;
    public TextView adtextcl2;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView=inflater.inflate(R.layout.tab5_layout,container,false);
        mLayout=rootView.findViewById(R.id.tab5);
    }
}

我对 Android Studio 还很陌生,因此我尝试自行修复它,但在 Google 上没有找到好的答案。

如何防止应用程序崩溃? (奖励视频一结束就崩溃)

提前致谢。

最佳答案

像这样更改 onRewardedVideoAdRewarded 方法

@Override
public void onRewardedVideoAdRewarded(Placement placement) {
final Class2 cl2 = new Class2();

cl2.greyBackgroundcl2 = (ImageView) findViewById(R.id.greyBackgroundcl2);
cl2.adtextcl2 = (TextView)findViewById(R.id.adtextcl2);
cl2.showcl2 = (Button) findViewById(R.id.showVideocl2);

MainActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        cl2.showcl2.setVisibility(View.INVISIBLE);
        cl2.greyBackgroundcl2.setVisibility(View.INVISIBLE);
        cl2.adtextcl2.setVisibility(View.INVISIBLE);

    }
});
}

关于java - "Only the original thread that created a view hierarchy can touch its views. "如何解决我的情况下的崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58477049/

相关文章:

org.apache.jsp.index_jsp._jspInit 中的 java.lang.NullPointerException

java - 闹钟android中的贪睡功能

java - 创建抽象 Activity 类

python - 在cython中声明一个类的实例

java - 在 Java 中解析格式错误的 json

java - 如何获取系统数据并使我的应用程序针对操作系统独一无二

java - 是否有 svnserve 的 Java 解决方案,就像 svnkit 在 Java 中的颠覆一样?

Android sqlite无法创建TEMP表

Android Listview - 如何在 getview() 覆盖中设置 ListView 。 ListView 采用父布局而不是 ListView

c# - 为什么基类必须有一个带 0 个参数的构造函数?