android新建进程操作UI进程中的view报错android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

报错:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views。

下面提供一种解决方式:thread+Handle,其中Handle使用静态内部类的方式实现更新主进程中的view.

 

问题:

Runnable runnable = new Runnable() {
     @Override
    public void run() {
        try {
            sleep(3000);
            TextView2.setText("123");
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
    }
};
new Thread(runnable).start();

TextView2.setText("123");是在新进程中访问UI(主)进程的控件。错误存在的原因。

我们使用handle,在handle写更新控件的操作,然后在新开启的进程new thread中发送handle消息,通知更新即可。

代码如下:

Runnable runnable = new Runnable() {
        @Override
        public void run() {
            try {
                sleep(3000);
                Message message = myHandle.obtainMessage();
                myHandle.sendMessage(message);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
};
new Thread(runnable).start();

其中 Message message = myHandle.obtainMessage();
        myHandle.sendMessage(message);是自定义的handle,在里面实现更新view

代码如下:

public class MainActivity extends Activity {

    public static ImageView imageView1;
    MyHandle myHandle = new MyHandle(MainActivity.this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView1=findViewById(R.id.textVeiw);
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
        try {
               sleep(3000);
                Message message = myHandle.obtainMessage();
                myHandle.sendMessage(message);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
            }
     };
     new Thread(runnable).start();
    }
    private static class MyHandle extends Handler {
        private WeakReference<MainActivity> activityWeakReference;

        public MyHandle(MainActivity activity) {
            super();
            this.activityWeakReference = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (activityWeakReference == null) {
                return;
            }
            activity.imageView1.setText("12345");//实现更新view
        }
    }
}

这里使用了静态内部类+弱引用的方式实现handle,可能比一般的实现方式稍微复杂,,原因是直接在MainActivity中使用handle会有内存泄漏的危险,可以看一下:https://blog.csdn.net/qq_25066049/article/details/83345692

 

 

### 回答1: ger是什么? android.support.v4.view.viewpager是一个Android支持库的类,用于创建可滑动的视图容器,可以在其添加多个视图,并通过滑动手势在它们之间进行切换。ViewPager通常用于创建轮播图、图片浏览器、引导页等界面。它是Android开发常用的UI组件之一。 ### 回答2: android.support.v4.view.viewpager是一个用于在Android应用程序创建可滑动的页面的类,它扩展了android.view.ViewGroup类,并允许用户左右滑动来浏览不同的页面。它是Android支持库实现的ViewPager组件,可以在较旧版本的Android设备上使用。 ViewPager类通常与Fragment和FragmentPagerAdapter一起使用,以创建具有多个页面的应用程序。使用ViewPager,我们可以创建一个具有多个片段或视图的容器,用户可以通过左右滑动来浏览这些页面。ViewPager类提供了各种方法和回调,以使用户能够滑动切换页面,监听页面的变化,并实现自定义的页面切换动画等功能。 通过使用ViewPager,我们可以方便地实现用户友好的用户界面,例如介绍页、图片浏览器、产品目录、闻阅读器等。它可以提供流畅的页面切换效果,并且还可以实现预加载、缓存等功能,以提高应用程序的性能和用户体验。 要使用android.support.v4.view.viewpager,首先需要在Android项目添加支持库,然后在布局文件添加ViewPager组件,并配置适配器以提供页面内容。接下来,我们需要创建Fragments或视图,以便在ViewPager显示。最后,我们可以设置监听器来处理页面的变化以及其他自定义功能。 总之,android.support.v4.view.viewpager是一个强大而灵活的组件,可以帮助我们创建具有多个页面的Android应用程序,并提供各种功能和扩展选项以满足不同的需求。 ### 回答3: android.support.v4.view.ViewPager是Android开发的一个控件,用于在界面创建可滑动的页面布局。它是支持库的一部分,用来兼容较低版本的Android系统。 ViewPagerAdapter是一个适配器类,用于将数据与ViewPager进行绑定,并管理页面的创建与销毁。它继承自PagerAdapter,并实现了其的几个抽象方法。 使用ViewPagerAdapter首先需要创建一个继承自它的自定义适配器类,并重写其的方法。其最重要的方法是getCount()和instantiateItem()。 getCount()方法用于返回ViewPager总共的页面数。这个值应该根据数据源的大小来确定,可以通过返回数据源的大小或固定的值来实现。 instantiateItem()方法用于创建ViewPager的每一个页面。这个方法会在ViewPager需要显示的页面时被调用。在这个方法,我们需要创建一个的视图,并将视图与数据源进行绑定。 ViewPagerAdapter还有其他一些方法,如destroyItem()、isViewFromObject()等,用于管理页面的销毁和判断视图是否来自于一个特定的对象。 使用ViewPagerAdapter时,我们首先需要创建一个ViewPager对象,并通过setAdapter()方法将适配器与ViewPager进行关联。然后,适配器会根据定义的方法来创建和管理页面。 总的来说,android.support.v4.view.ViewPager和其适配器类ViewPagerAdapter为Android开发者提供了一种简洁、方便的方式来实现可滑动的页面布局,并兼容较低版本的Android系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值