在Java中,线程的建立方法如下。
新建一个类,接口Runnable,重载 run方法
import javax.swing.JTextField; public class test implements Runnable{ @Override public void run() { } }
在需要开始这个线程的地方,这样创建线程
private Thread th; test te = new test(); th = new Thread(te); th.start();
Java中调用线程的时候,可以直接访问JFrame上的组件,并更改其值,但是在安卓中,如果一个子线程涉及到UI更新,Android主线的线程是不安全的。更新UI只能在主线程中更新。
所以要把Message通过handler来send,然后利用callback来接收。
新建类,接口Callback
重载的handleMessage中就是对从子线程中传入的Message做处理。
import android.os.Handler.Callback; import android.os.Message; import android.widget.TextView; public class CB implements Callback{ private TextView tv; public TextView getTv() { return tv; } public void setTv(TextView tv) { this.tv = tv; } @Override public boolean handleMessage(Message msg) { int number = msg.arg1; tv.setText("Test "+number); return true; } }
实例化Handler对象,利用传入Callback对象的构造方法
Handler handler = new Handler(cb);
构造类,接口Runnable ,并传入Handler。
创建Message对象,给其两个参数赋值。利用Handler传出参数。
其中int类的message用来实现线程虚拟挂起的功能(运行死循环,但是不对参数进行改变)
import android.os.Handler; import android.os.Message; import android.widget.TextView; public class Number implements Runnable{ private TextView tv; private Handler handler; private int message = 0; public int getMessage() { return message; } public void setMessage(int message) { this.message = message; } public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } public TextView getTv() { return tv; } public void setTv(TextView tv) { this.tv = tv; } @Override public void run() { int i = 0; while(true){ if(message == 1){ continue; }else{ i++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = new Message(); msg.arg1 = i; handler.sendMessage(msg); } } } }
所以,利用线程同时需要更新ui的话,构造顺序如下。
1.实例化接入了Callback的类,cb;
2.实例化接入了Runnable的类,num;
3.实例化Handler,利用传入Callback的构造方法;
4.cb中传入要更新的view;
5.num中传入message(挂起用);
6.num中传入handler;
7.start;
主Activity如下
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private int flag = 0; private Number num; private Thread th; private TextView tv; private CB cb; private Handler handler; private Button bu; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void Start(View v) { if (flag == 0) { num = new Number(); th = new Thread(num); tv = (TextView)this.findViewById(R.id.Text); cb = new CB(); cb.setTv(tv); bu = (Button) this.findViewById(R.id.button); handler = new Handler(cb); num.setHandler(handler); num.setTv(tv); num.setMassage(0); th.start(); bu.setText("Stop"); flag = 1; } else if (flag == 1) { bu.setText("Start"); num.setMassage(1); flag = 2; } else if( flag == 2){ bu.setText("Stop"); num.setMassage(0); flag = 1; } } public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
来源:https://www.cnblogs.com/he11o-liu/p/7503264.html