这一节,简单地总结一下Android中常见更新UI的几种方式,如下:
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MainActivity extends Activity { public static String s="Welcome to Android"; private TextView tvShow; Handler h=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==1){ String res= (String) msg.obj; tvShow.setText(res); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvShow = (TextView) findViewById(R.id.tv); ShowInfo(); } private void ShowInfo() { ExecutorService es = //创建一个只有一个线程的线程池 Executors.newSingleThreadExecutor(); //创建一个有上线的线程池 //Executors.newFixedThreadPool(2); //构建一个没有上限的线程池,具体上限为多少由操作而定。 // Executors.newCachedThreadPool(); es.execute(new Runnable() { @Override public void run() { try { Thread.sleep(2000); // //方式(1) // h.post(new Runnable() { // @Override // public void run() { // tvShow.setText(s); // } // }); //方式(2)handler发消息 Message message = new Message(); message.what=1;//发送的标志 message.obj=s;//发送的信息 h.sendMessage(message); //方式(3)runOnUiThread // runOnUiThread(new Runnable() { // @Override // public void run() { // tvShow.setText(s); // } // }); //方式(4)view.post()方式 // viewUI(); } catch (InterruptedException e) { e.printStackTrace(); } } }); //关闭线程池(一般是停止服务时关闭线程池) es.shutdown(); } private void viewUI() { tvShow.post(new Runnable() { @Override public void run() { tvShow.setText(s); } }); } }
这几种更新UI的方式本质上都是通过Handler发消息来实现的。
可能会用到的知识:
线程池概念:1)内存中一块区域2)这个区域可以存储若干个线程对象3)此池中线程可以被重复利用。
线程池的作用:1)减少线程对象的创建及销毁过程。2)提升工作效率(需要时从池中取)
Java中线程线程池对象的构建及应用:1)Executor(线程池对象的顶层接口)2)ExecutorService(继承Executor),ScheduledExecutorService3)Executors(工具类)。