0717-7821348
关于我们

欢乐彩安全吗

您现在的位置: 首页 > 关于我们 > 欢乐彩安全吗
欢乐彩票官网诈骗-Android开发——完成子线程更新UI
2019-12-14 01:38:13

线程按功用分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程主线程不能履行那些耗时过长的代码或使命(履行耗时过长的代码会呈现运用未呼应欢乐彩票官网诈骗-Android开发——完成子线程更新UI的提示),所以都是运用子线程来履行耗时过长的代码,比如说下载文件等使命。

一般状况,子线程中履行过长的代码,都需求进行更新UI操作。

可是Android中,为了避免安全,是不答应在子线程更新UI的,可是咱们可以运用到Android官方给予的API来完成子线程更新UI激情性爱小说的操作(本质上,这些API也是切换回了主线程来进行更新UI)

比如:点击一个按钮,过了1s后完成了下载使命,回来了数据,此数据会显现在界面上

详细解说:

点击按钮,之后敞开一个子线程来模仿下载进程(线程休眠1s),之后使命履行结束会回来数据(一个String),运用回来的数据更新UI

新建一个办法,用来模仿下载使命

/**
* 模仿下载
*/
fun download(): String {
Thread.sleep(欢乐彩票官网诈骗-Android开发——完成子线程更新UI1000)
return "this is data"
}

下面的运用6种办法和上面的模仿下载使命的办法,来完成上面比如的作用

1.Activity.runOnUiThread()

runOnUiThread是Activity中的办法,只要当时目标是Activity,就可以直接运用,假如当时的目标不是Activity,需求找到Activity目标,才干履行此办法

runOnUiThread办法的参数为一个Runnable接口,我运用的kotlin,所以有许多东西都是省掉了

设置按钮的点击事情,点击按钮敞开一个线程

btn_start.setOnClickListener {
thread {
val data = download()
runOnUiThread({
//这儿进行更新UI操作
tv_show.text = data
})
}
}

Java版

btn_start.setOnClickListener(new OnClickListener(){
new Thread(new Runnable(){
String data = download();
runOnUiThread(new Runnable(){
@Override
public void run() {
tv_show.setText(data);
}
})
}).start();
});

2.View.post()

post办法是View目标的办法,参数也是接纳一个runnable接口

这儿我选用的view目标是需求进行更新textview的自身,当然也可以选用其他的View目标,只要是欢乐彩票官网诈骗-Android开发——完成子线程更新UI在当时Activity的目标都可以

btn_start.setOnClickListener {
thread {
val data = download()
//挑选当时Activity欢乐彩票官网诈骗-Android开发——完成子线程更新UI的View目标都可以
tv_show.post {
tv_show.text = data
}
}
}

3.View.PostDelayed()

此办法和上面的post办法相似,仅仅多一个参数,用来完成推迟更新UI的作用

btn_start.setOnClickListener {
thread {
val data = download()
tv_show.postDelayed({
tv_show.text = data
},2000)
}
}

上面的代码完成的作用是点击按钮之后,过了3s后才会看到界面发作改动

4.Handler.post()

new一个Handler目标(全局变量)

private val handler = Handler()

运用post办法更新UI,此post办法和之前的post办法相同,参数都是为Runnable接口

btn_start.setOnClickListener {
thread {
val data = download()
handler.post {
tv_show.text = data
}
}
}

5.AsyncTask(引荐)

阐明

AsyncTask是一个笼统类,有必要创立一个子类类承继它

这儿介绍一下关于AsyncTask的三个泛型参数和几个办法

泛型参数可以为恣意类型,为空的话运用Void

参数 阐明 params 参数泛型,doInBackground办法的参数 progress 进展泛型,onProgressUpdate办法的参数 result 成果泛型,onPostExecute办法的参数 笼统办法阐明:

办法名 阐明 onPreExectute() 此办法中,常常进行初始化操作,如进展条显现 doInBackground(Params...) 此办法有必要完成, onProgressUpdate(Progress...) 进行更新UI的操作 publishProgress(Progress...) 在doInBackground办法中调用,调用此办法后会回调履行onProgressUpdate办法进行更新UI onPostExcute(Result) 使命结束之后进行更新UI 简略来说,假如子类承继了AsyncTask,它的笼统办法的参数都会变成泛型对应的类型

比如

下面的代码是取自我的APP,简略地阐明一下AsyncTask

我传入的是3个泛型参数别离为String,DownloadingItem,DownloadedItem,别离对应的params,progress和result泛型

这儿我是依据自己的需求而两个类DownloadingItem和DownloadedItem,从下面的代码可以看到,笼统办法的参数变为了咱们的泛型的类型

internal inner class DownloadingTask : AsyncTask() {
override fun onPreExecute() {
//一些初始化操作
}
override fun doInBackground(vararg params: String?): DownloadedItem {
//params是一个参数数组,假如创立DownloadingTask目标只传入了一个参数,直接取下标为0的那个即可(需求转型)
//耗时操作(如下载操作),取得进展数据

//将新的进展数据传递到onProgressUpdate办法,更新UI
publishProgress(messageItem)

//使命履行结束,回来成果(回调onPostExecute办法)
}
override fun onProgressUpdate(vararg values: DownloadingItem?) {
//这儿运用最新的进展来进行相关UI的更新
//values是一个DownloadingItem数组,取结尾那个即为最新的进展数据
}
override fun onPostExecute(result: DownloadedItem?) {
//下载成功提示或者是其他更新UI的操作
}
}

履行:

履行Task的时分需求在主线程(UI线程调用)

DownloadingTask().execute("参数")

批量下载:

//答应在同一时刻有5个使命正在履行,而且最多可以存储50个使命
private val exec = ThreadPoolExecutor(5, 50, 10, TimeUnit.SECONDS, LinkedBlockingQueue())
DownloadingTask().executeOnExecutor(exec, url)

6.Handler机制完成(中心)

其实,Handler机制是子进程更新UI的中心

咱们上面的五种完成子进程更新UI的办法,都是根据Handler机制完成的

详细机制本文就不多说了,网上有许多的机制阐明,这儿就只讲一下完成的过程

Message中有几个特点,what,arg1,arg2,这三个都是接纳一个Int,所以,传递数据不是很友爱,这儿就不预备完成之前的比如作用了

what表明来历,arg1和arg2用来传递Int数据

1.重写Handler类中的handleMessage办法

一般都是规则好一个Int的常量,来表明what

private val handler =object : Handler(){
override fun handleMessage(msg: Message?) {
if (msg.what == 1) {
//来历为1,则
}
}
}

2.发送Message

val msg = handler.obtainMessage()
//一般都是规则好一个Int的常量,来表明what
msg.what = 1
//传递Int数据
msg.arg1 = 20
handler.sendMessage(msg)