UWP与Android中如何在多线程中刷新UI

UWP与Android中如何在多线程中刷新UI

无论我们是在进行UWP开发亦或是Android开发,都会在程序运行的同时产生一个UI线程,这是管理你界面的线程,而这也导致你在子线程中越界修改界面时将会报错。本文将对UWP以及Android更改UI的方式进行讨论。

UWP

现在先假设我们拥有一个子线程thread1,其要去更改Mainpage中的一名为TextBox1的控件内的文字(在此例中System.Threading.Tasks.Task和System.Threading.Thread等价)

thread的定义为

private void thread(){
	/*
	do_something();
	*/
	TexBox.Text="Hello World!";
}

显然这样会报错,所以我们得采用通知UI线程进行更改的方式,其分为两步:

1.添加Invoke函数

2.将更改UI的action传入Invoke函数中

我们首先进行第一步

public async void Invoke(Action action, Windows.UI.Core.CoreDispatcherPriority Priority = Windows.UI.Core.CoreDispatcherPriority.Normal)
{
	await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Priority, () => { action(); });
}

这就是个模板函数,直接copy就行了,其作用为将传入的action通知UI线程

然后更改thread函数,重写当中关于更改UI的部分,将此action传入Invoke函数中

private void thread(){
	/*
	do_something();
	*/
	Invoke(() =>
    {
    	TexBox.Text="Hello World!";
    });
}

Android

在Android中更改UI是可以分成情况的,在非多线程的情况下我们可以直接通过Adapter的notifyDataSetChanged()刷新,而另外一种则可以用到 handler

使用handler同样分为两步

一是更改在你的page类中创建一个handler

二是在thread中传递message给hundler提示刷新

此处假设为更改一个listView并且其适配器为chatAdapter

public class MainActivity extends AppCompatActivity{
    //创建handler对象
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            int what = msg.what;
            switch(what) {
                case 0:
                    //提示Adapter刷新界面
                    chatAdapter.notifyDataSetChanged();
                default:
            }
        }
    protected void onCreate(Bundle savedInstanceState) {
    /*
    do_something()
    */
    }
}

注意在上面handler的定义中我们对于传入0的情况进行了定义,即当传入0时将会刷新UI

然后在thread中

 class thread extends Thread{
        public void run(){
            /*
            do_something();
            */
            //此时应已经做完更改值的操作,接下来为传递message更改UI
            Message message=Message.obtain();
            message.what=0;
            handler.sendMessage(message);
        }
    }

你可能感兴趣的:(Android,UWP,UWP,Android,C#,JAVA,WPF)