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

Android更新UI的几种方式

2017-03-22 19:54 330 查看

Android更新UI的几种方式

1、Activity的 runOnUiThread  

1

2

3

4

5

6

7

8

9

10

11

12

13

textView = (TextView) findViewById(R.id.tv );


       
new
Thread(new

Runnable(){


           
@Override


           
public
void

run() {


 

               
runOnUiThread(new
Runnable() {


                   
@Override


                   
public
void

run() {


                       
textView.setText("
更新
UI
");


                   
}


               
});


           
}


       
}).start();


androidActivity runOnUiThread()
方法使用

 

2、HandlersendEmptyMessage()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

package
lib.com.myapplication;


 

import
android.os.Handler;


import
android.os.Message;


import
android.support.v7.app.AppCompatActivity;


import
android.os.Bundle;


import
android.widget.TextView;


 

public
class
MainActivity extends
AppCompatActivity {


 

    
private
TextView textView ;


 

    
Handlerhandler = new

Handler( ) {


        
@Override


        
public
void

handleMessage(Messagemsg) {


            
super.handleMessage(msg);


            
textView.setText("Ui
更新了
");


        
}


    
};


 

    
@Override


    
protected
void

onCreate(BundlesavedInstanceState) {


        
super.onCreate(savedInstanceState);


        
setContentView(R.layout.activity_main);


 

        
textView= (TextView) findViewById( R.id.tv );


        
new
Thread(new

Runnable(){


            
@Override


            
public
void

run() {


                
try
{


                    
Thread.sleep(2000

);


                
}catch

(InterruptedException e) {


                    
e.printStackTrace();


                
}


 

                
handler.sendEmptyMessage(2

) ;


            
}


        
}).start();


 

    
}


}


3、Handler post()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package
lib.com.myapplication;


import
android.os.Bundle;


import
android.os.Handler;


import
android.support.v7.app.AppCompatActivity;


import
android.widget.TextView;


 

public
class
MainActivity extends
AppCompatActivity {


 

    
private
TextView textView ;


 

    
Handlerhandler = new

Handler();


 

    
@Override


    
protected
void

onCreate(BundlesavedInstanceState) {


        
super.onCreate(savedInstanceState);


        
setContentView(R.layout.activity_main);


 

        
textView= (TextView) findViewById( R.id.tv );


 

        
new
Thread(new

Runnable(){


            
@Override


            
public
void

run() {


                
try
{


                    
Thread.sleep(2000

);


                
}catch

(InterruptedException e) {


                    
e.printStackTrace();


                
}


 

                
handler.post(new
Runnable() {


                    
@Override


                    
public
void

run() {


                        
textView.setText("Ui
更新了
");


                    
}


                
});


            
}


        
}).start();


 

    
}


}


在子线程中切换到主线程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

new
Thread(new
Runnable() {


    
@Override


    
public
void

run() {


        
LogUtil.d("ttt  11111111111"

+ Thread.currentThread().getName() );


        
new
Handler(Looper.getMainLooper()).post(new
Runnable() {


            
@Override


            
public
void

run() {


                
LogUtil.d("ttt  55555555"
 
+ Thread.currentThread().getName() );


            
}


        
});


 

        
LogUtil.d("ttt  22222222222"
 
+ Thread.currentThread().getName() );


        
LogUtil.d("ttt  33333333333"
 
+ Thread.currentThread().getName() );


        
LogUtil.d("ttt  44444444444"
 
+ Thread.currentThread().getName() );


 

    
}


}).start();


  结果

1

2

3

4

5

ttt  11111111111Thread-155


ttt  22222222222Thread-155


ttt  33333333333Thread-155


ttt  44444444444Thread-155


ttt  55555555main


  可见这种方式可以快速切换线程,从log日志来看,切换到主线程不会阻塞子线程。

 

4、viewPost() 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

textView = (TextView) findViewById(R.id.tv );


       
new
Thread(new

Runnable(){


           
@Override


           
public
void

run() {


               
try
{


                   
Thread.sleep(2000

);


               
}catch

(InterruptedException e) {


                   
e.printStackTrace();


               
}


 

               
textView.post(new
Runnable() {


                   
@Override


                   
public
void

run() {


                       
textView.setText("Ui
更新了
");


                   
}


               
});


           
}


       
}).start();


总结:

1、其实上面的四种方式都可归结于一种方式:handler用于Android线程之间的通信。

2、为什么android要求只能在UI线程进行UI操作?主要还是为了避免多线程造成的并发的问题。在单线程操作UI是安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android