android线程

来源:互联网 发布:h5小游戏源码免费下载 编辑:程序博客网 时间:2024/05/16 23:42
案例总结:这里用到的线程的第一种方案,这种方案的建立的基础是硬件设施有双核cpu,一个用来完成图形的绘制,另外一个cpu完成耗时的操作,这种方案需要注意的是:1、先有一个Handler ,这个是完成线程第一种方案的前提,只有有了Handler 才能完成我们的线程的操作,有了handler后,我们调用handler;中的post方法,其中post方法里有几个不同参数的方法,其中最后一个方法的参数的是时间,毫秒为单位,当然也可以在线程完成sleep()方法来完成我们的设置,之后手写线程,记住,这二个都是主线程,不存在主线程和子线程的说法,因为post方法里面的是runable接口, 因为我们只要实现runable接口的线程,,最后一步,也是最重要是一步,就是二个主线程必须都走post方法,这样才能做到二个都主线程,同时,因为本身activity就是主线程,因此这个执行永远不会停,这是第一种方案的优点,也是缺点,优点,是可以用来做一些游戏背景音乐等,缺点public class MainActivity extends Activity {private ProgressBar progressBar;private Handler handler;private MyThread thread;private int count = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);progressBar = (ProgressBar) this.findViewById(R.id.pb_process);handler = new Handler();thread = new MyThread();handler.postDelayed(thread, 1000);}class MyThread implements Runnable {@Overridepublic void run() {if (count < 10) {try {Thread.sleep(1000);progressBar.setProgress(count);count++;} catch (InterruptedException e) {e.printStackTrace();}} else {count = 0;}handler.post(thread);}}}

=====================================================================================================

第二种方案:异步任务子线程和主线程数据传递1、Message封装数据2、Handler发送和接收数据3、主线程实例化handler * android线程结构: * 1】Message对象封装数据 * 2】Queue消息队列由android系统自动生成 * 3】Handler从消息队列中获取Message对象完成操作,相当于BundleLooper:循环主线程默认捆绑了getMainLooper(),这个是真的子线程,循环都得自己完成,这是跟前面第一种方式的最大区别:==============案例=============================================================第二种方式的线程跟前面第一种线程的最大的区别是,第二种方法实现的线程是真正的线程,第二种线程有几个必须了解的新的:Message,looper, 实现第二种线程步骤:1、首先继承得到真正的线程类,class CountThread extends Thread,这样得到一个真的线程类,子线程和主线陈间数据传递依靠:Message message = new Message();//传递数据用的Message,相当于生成了一个包裹 message.what = 100;//这个编号用来区别不同子线程发送的数据,编号是唯一的message.obj = count;//这是第一个常量obj,代表传递数据//发送myHandler.sendMessage(message);这样把子给了发送出去……2、重写Handler3、开始线程重写HandlerhandlerMessage(Message){switch(Message.what编号数据)}public class MainActivity extends Activity {/** * 线程二 * 打印0到9 * 2.子线程向主线程发送数据完成数字打印 *  * android线程结构,更Java完全不同, * android线程结构: * 1】Message对象封装数据 * 2】Queue消息队列由android系统自动生成 * 3】Handler从消息队列中获取Message对象完成操作 */private TextView tv_text ;private MyHandler myHandler = null;private Button bt_star;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_text = (TextView) this.findViewById(R.id.tv_text);bt_star = (Button) this.findViewById(R.id.bt_01);myHandler = new MyHandler(getMainLooper());//最后,启动子线程bt_star.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {CountThread thread = new CountThread();thread.start();}});}class CountThread extends Thread{/** * 完成数字的累加 */@Overridepublic void run() {try {for(int count = 0; count < 10; count++){sleep(1000);Message message = new Message();//传递数据用的Message,相当于生成了一个包裹message.what = 100;//这个编号用来区别不同子线程发送的数据,编号是唯一的message.obj = count;//这是第一个常量obj,代表传递数据//发送myHandler.sendMessage(message);}} catch (InterruptedException e) {e.printStackTrace();}super.run();}}class MyHandler extends Handler{//Looper代表了我们的一个队列,存放了messgage的队列//androi系统将所有的Message对象存放到消息队列(looper)中public MyHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {//区分不同线程发送的消息switch (msg.what) {case 100://完成计数数字传递int count = (Integer) msg.obj;tv_text.setText("数字:"+count);break;}super.handleMessage(msg);}}}

=====================================================================================================


第三种方案
public class MainActivity extends Activity {/** * android:通过异步任务,完成子线程和主线程数据的传递 *  * 功能:点击按钮,启动计数, *  * 缺点:在整个activity上,只允许运行一个异步任务程序! *  */Button button1;TextView textView1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button) this.findViewById(R.id.button1);textView1 = (TextView) this.findViewById(R.id.textView1);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new MyTask(MainActivity.this).execute((Void)null);}});}========================
========================
/** * * @author Administrator * @Params:主线程跟子线程传递数据类型 * @Progress:主线程是否需要相应数据的返回类型 * @Result:子线程运行完毕是否需要返回数据类型 */public class MyTask extends AsyncTask<Void, Integer, Integer> {Context context;public MyTask(Context context) {this.context = context;}/** * onPreExecute():执行之前,就是doInBackground执行之前,这个方法所在的主线程运行 */@Overrideprotected void onPreExecute() {Toast.makeText(this.context, "onPreExecute", 1).show();super.onPreExecute();}/** * doInBackground:后台执行,这个方法理解就是:run(),这个方法已经属于子线程了 */@Overrideprotected Integer doInBackground(Void... params) {int count = 0;while(count < 10){count++;//子线程需要向主线程计数:this.publishProgress(count);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}/** * Integer...代表Integer数组,这个方法是运行主线程 */@Overrideprotected void onProgressUpdate(Integer... values) {TextView textView = (TextView) ((Activity)context).findViewById(R.id.textView1);textView.setText(values[0] + "");super.onProgressUpdate(values);}/** * doInBackground运行完毕,后就会执行onPostExecute这个方法,onPostExecute:执行之后,这个方法运行主线程 */@Overrideprotected void onPostExecute(Integer result) {Toast.makeText(this.context, "onPostExecute", 1).show();super.onPostExecute(result);}




0 0
原创粉丝点击