Android学习记录:线程
2015-09-27 20:39
531 查看
在Java中,线程的建立方法如下。
新建一个类,接口Runnable,重载 run方法
在需要开始这个线程的地方,这样创建线程
Java中调用线程的时候,可以直接访问JFrame上的组件,并更改其值,但是在安卓中,如果一个子线程涉及到UI更新,Android主线的线程是不安全的。更新UI只能在主线程中更新。
所以要把Message通过handler来send,然后利用callback来接收。
新建类,接口Callback
重载的handleMessage中就是对从子线程中传入的Message做处理。
实例化Handler对象,利用传入Callback对象的构造方法
构造类,接口Runnable ,并传入Handler。
创建Message对象,给其两个参数赋值。利用Handler传出参数。
其中int类的message用来实现线程虚拟挂起的功能(运行死循环,但是不对参数进行改变)
所以,利用线程同时需要更新ui的话,构造顺序如下。
1.实例化接入了Callback的类,cb;
2.实例化接入了Runnable的类,num;
3.实例化Handler,利用传入Callback的构造方法;
4.cb中传入要更新的view;
5.num中传入message(挂起用);
6.num中传入handler;
7.start;
主Activity如下
新建一个类,接口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; } }
相关文章推荐
- 安卓存储
- android开发时的参考
- 实现状态栏一体化
- java4Android(22)Map/HashMap的方法:put()/set()
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- 关于坑爹的PopupWindow的“阻塞”争议问题:Android没有真正的“阻塞式”对话框
- Android Custom View --- Continuous Slider(连续滑动器)
- Android——DDMS简单介绍
- Android——DDMS简单介绍
- android 二维码,条形码生成与扫描识别
- 初窥VIsual Studio2015的跨移动平台开发
- Android中的Canvas和Paint类
- 【转载】Parameter must be a descendant of this view问题的解决方案
- Android菜鸟还是当走一点,学一点罢(对基础的学习万不可松懈)
- Android SDK Manager 更新代理
- 【Android】周末读博客小记
- Android学习笔记(八)深入分析Service启动、绑定过程
- android开发环境搭建
- Android设置全局字体大小解决方案
- Android线程池操作