您的位置:首页 > 产品设计 > UI/UE

android线程中更新UI的三种方法 Demo

2016-12-21 18:34 381 查看
activity_main.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cn.com.zifar.threadui.MainActivity">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnDown"
android:text="@string/btnDown"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnHandler"
android:text="@string/btnhandle"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/btnview"
android:id="@+id/btnView"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tipsText"
android:visibility="gone"
/>
</LinearLayout>


string.xml内容

<resources>
<string name="app_name">ThreadUi</string>
<string name="btnDown">下载(runOnUiThread)</string>
<string name="btnhandle">下载(handler)</string>
<string name="btnview">下载(view)</string>
</resources>


DownItems.java类

/**
* 要下载的数据表
*/

public enum DownItems {
/**
* 巡检地点表
*/
PatrolAddress("PatrolAddress","巡检地点表"),
/**
* 巡检部门表
*/
PatrolDepart("PatrolDepart","巡检部门表"),
/**
* 巡检线路
*/
PatrolLine("PatrolLine","巡检线路"),
/**
* 巡检员设备信息
*/
PatrolTools("PatrolTools","巡检员设备信息"),
/**
* 巡检项目关联设备
*/
XjProject("XjProject","巡检项目关联设备"),
/**
* 待巡检设备类型
*/
SettingType("SettingType","待巡检设备类型"),
/**
* 待巡检具体项目表
*/
SpotSettings("SpotSettings","待巡检具体项目表"),
/**
* 巡检项明细配置
*/
XjDetailsSetting("XjDetailsSetting","巡检项明细配置"),
/**
* 巡检人员表
*/
PatrolUser("PatrolUser","巡检人员表")
;

private String entext;
private String cntext;
private DownItems(String exText,String cnText){
this.entext=exText;
this.cntext=cnText;
}
public String GetValue(){
return entext;
}
public String GetText(){
return cntext;
}
}

MainActivity代码:
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private TextView tipsText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//runOnUiThread的方式更新UI
final Button btnDown=(Button)this.findViewById(R.id.btnDown);
tipsText=(TextView)this.findViewById(R.id.tipsText);
btnDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownLoadThread(btnDown,tipsText).start();
}
});

//Handler的方式更新
final Button btnHandler=(Button)this.findViewById(R.id.btnHandler);
btnHandler.setOnClickListener(new View.OnClickListener() {
Handler mhandle=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
String data=(String) msg.obj;
tipsText.setText(data);
break;
case 0:
tipsText.setVisibility(View.VISIBLE);
btnHandler.setEnabled(false);
break;
case 2:
tipsText.setText("完成操作");
btnHandler.setEnabled(true);
break;
}

}
};
@Override
public void onClick(final View view) {
UpdateMainUiForHandler();
}
private void UpdateMainUiForHandler(){
new Thread(new Runnable() {
@Override
public void run() {
DownItems[] items =DownItems.values();
int index=0;
mhandle.sendEmptyMessage(0);
while (index<10){
for(final DownItems item:items){
Message msg=mhandle.obtainMessage();//不用new Message(),避免产生新的Message浪费资源
msg.obj=item.GetText();
msg.what=1;
mhandle.sendMessage(msg);
try
{
Thread.sleep(100);
}catch (Exception ex){
ex.printStackTrace();
}
}
try
{
Thread.sleep(1000);
}catch (Exception ex){
ex.printStackTrace();
}
index++;
}
mhandle.sendEmptyMessage(2);
}
}).start();
}
});

//post的方式更新
final Button btnview=(Button)this.findViewById(R.id.btnView);
btnview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
btnview.post(new Runnable() {
@Override
public void run() {
btnview.setEnabled(false);
}
});
tipsText.post(new Runnable() {
@Override
public void run() {
tipsText.setVisibility(View.VISIBLE);
}
});
DownItems[] items =DownItems.values();
for(final DownItems item:items){
tipsText.post(new Runnable() {
@Override
public void run() {
tipsText.setText(item.GetText());
}
});
try{
Thread.sleep(1000);
}catch (Exception ex){
ex.printStackTrace();
}
}
tipsText.post(new Runnable() {
@Override
public void run() {
tipsText.setText("操作完成");
}
});
btnview.post(new Runnable() {
@Override
public void run() {
btnview.setEnabled(true);
}
});
}
}).start();
}
});
}

protected class DownLoadThread extends Thread{
private Button btnDown;
private TextView tipsText;
public DownLoadThread(Button btnDown,TextView tipsText){
this.btnDown=btnDown;
this.tipsText=tipsText;
}
@Override
public void run() {
DownItems[] items =DownItems.values();
runOnUiThread(new Runnable() {
@Override
public void run() {
btnDown.setEnabled(false);
tipsText.setVisibility(View.VISIBLE);
}
});
boolean flag=true;
int index=0;
while (flag){
for(final DownItems item:items){

runOnUiThread(new Runnable() {
@Override
public void run() {
tipsText.setText(item.GetText());
}
});
index++;
if(index>=100)flag=false;
try{
Thread.sleep(100);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
btnDown.setEnabled(true);
tipsText.setText("操作完成");
}
});
}
}

}

三种方式各有特点,用的时候可根据需要进行选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐