在子线程中更改主线程中的控件的信息,在子线程中用toast

一丶在子线程中不允许更改主线程中的控件的信息,也不允许在子线程中用toast,我们要更改的话

(1)消息机制:使用handler

(由主线程调用)

在主程序中Handler handler = new Handler(){

public void handleMessage(Message msg){

int type = msg.what ;//拿到msg的类型,再判断
            switch (type) {
                case SUCCESS:
                    //拿到信息
                    String info  = (String)msg.obj ;
                   //
                    break;
    
                case FAILED:
                    //拿到信息
                    String faild  = (String)msg.obj ;
                    Toast.makeText(MainActivity.this, faild, 0).show() ;
                    break;
                case ERROR:
                    //拿到信息
                    String error  = (String)msg.obj ;
                    Toast.makeText(MainActivity.this, error, 0).show() ;
                    break;
            }

};

};

而在子线程中要设置Message  msg;

msg.what(设置类型)

msg.obj(设置内容)然后发送:handler.sendMessage(msg);

(2)常见消息处理api:
  runOnUiThread(runnable): 在ui主线程中运行
  playAtTime() : 在某个时间运行
  playDelay(): 延时运行

例:public class MainActivity extends Activity {

private TextView tvinfo ;
    
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            System.out.println("接收到了消息");
            tvinfo.setText((String)msg.obj) ;
        };
    } ;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tvinfo = (TextView) findViewById(R.id.tvinfo) ;
    }
    public void click(View view){ 
        handler.postDelayed(new Runnable() { 
            @Override
            public void run() {
                Message msg = Message.obtain() ;
                msg.obj = "哈哈哈,我改变了UI上的内容" ;
                handler.sendMessage(msg) ;
            }
        }, 3000) ;   
    }
}

时间: 2024-10-10 00:51:38

在子线程中更改主线程中的控件的信息,在子线程中用toast的相关文章

在C#中子线程如何操作主线程中窗体上控件

在C#中子线程如何操作主线程中窗体上控件 在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作. 要实现该功能,基本思路如下: 把想对另一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数,并且在那个函数中加入一个判断,用 InvokeRequired

线程间操作无效: 从不是创建控件"窗体的名称"的线程访问它.

有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数. 问题原因是.net2.0以后拒绝多线程访问空间,避免空间造成死锁.以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true.如果不会好几个线程同时操作一个控件用方法1就可以.如果存在多个线程一起操作控件使用方法2 方法2可以 Invoke(new Method

Android新线程中更新主线程中的UI控件

Android中的View都不是线程安全的,所以如果在某一个新线程中直接更新主线程中的UI控件时就会报如下错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 为了解决在另一个线程中更新UI控件的问题,我们可以使用如下几种解决方案: 1. 自己写Handler解决,参见<And

Android中,子线程使用主线程中的组件出现问题的解决方法

Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行的功能交由Handler类来处理.这样就解决了线程出现的问题. 下面测试实例功能为单击图片,图片透明度改变为50,300毫秒后恢复不透明,代码如下: public class Demo extends Activity{ private ImageView changeImg = null;//Im

线程间操作无效: 从不是创建控件“button1”的线程访问它。

.net2后是不能跨线程访问控件的.,窗体上的控件是当前主线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会报错:线程间操作无效: 从不是创建控件“某某某”的线程访问它. C# WinForm开 发中,这是一个比较常见的异常:线程间操作无效,从不是创建控件“xxx”的线程访问它.这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程 创建的控件.解决方法主要有两种,一种是在窗口线程中设置Check

网络操作不能直接写在主线程中 以及 为什么不能在子线程中更新UI控件的属性

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //注意: 所有网络操作不能直接写在主线程中 因为所有的网络操作都是耗时的,如果加载到主线程中,会导致与用户的交互出现问题 ,所以要加载到子线程中 // [self loadImage]; [self performSelectorInBackground:@selector(loadImage) withObject:nil]; } //加

用Handler的post()方法来传递线程中的代码段到主线程中执行

自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法就是将Runnable中的代码段传送到主线程. 布局文件就是个textView,我就不贴了. 全部代码 package com.kale.handler; import android.app.Activity; import android.graphics.Color; import andro

在用户线程/主线程中推荐MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()函数

在多线程编程中,通常都需要线程间的同步,一个线程要等待另一个线程的事件才继续执行,一般的做法是采用WaitForSingleObject和WaitForMultipleObjects()函数来实现. 但在实际的应用中,经常出现等待线程卡死的状况,也就是说等待的事件一直无效.为什么事件一直无效呢?很多的情况是等待线程阻塞了另外的线程,使另外的线程无法设置事件有效.为什么会阻塞呢?原因就比较多了,需要具体问题具体分析. WaitForSingleObject和WaitForMultipleObjec

[Android] 任意时刻从子线程切换到主线程的实现原理及加强版

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41900879 ========================================================