zoukankan      html  css  js  c++  java
  • Android再学习-20141023-Intent-Thread

    20141023-Android再学习

    Intent对象的基本概念

    1. Intent是Android应用程序组件之一
    2. Intent对象在Android系统中表示一种意图
    3. Intent当中最重要的内容是action与data

    Intent对象的基本使用方法

    使用Intent在Activity之间传递数据的方法

    1. 在Activity之间可以通过Intent对象传递数据
    2. 使用putExtra()系列方法向Intent对象当中存储数据
    3. 使用getXXXExtra()系列方法从Intent对象当中取出数据

    回顾Java当中的线程概念

    1. 线程的两种实现方式
      1. 继承Thread,代表线程
      2. 实现相关接口,代表线程体
    2. 线程的生命周期
    3. 多线程同步

    MainThread(UI Thread)和Worker Thread

    • 所有与UI有关的代码写在MainThread当中。
    • 主线程不能阻塞,主线程一般不进行耗时较长的操作,比如联网下载,读取大文件等。

    Android当中的线程使用

    什么是Handler

    Handler、Looper和MessageQueue的基本原理

    Handler把消息对象添加到MessageQueue中,Looper负责从MessageQueue的头部不断取出消息对象,取出一个消息对象之后交给Handler处理。

    public void onClick(View v){
    	//当用户点击按钮是,创建一个消息对象,并使用Handler发送该消息对象
    	Message msg = handler.obtainMessage();//获取Message对象
    	msg.what = 2;//给Message属性赋值
    	handler.sendMessage(msg);//把消息对象放到消息队列当中去
    	//1. Looper将会从消息队列当中将消息对象取出,
    	//2. Looper将会找到与消息对象对应的Handler对象(每一个消息对象都有一个对应的Handler对象)。
    	//3. Looper将会调用消息对象的handleMessage(Message, msg)方法,用于处理该消息对象
    }
    

    通过Handler实现线程间的通信

    在主线程当中实现Handler的handleMessage()方法

    在Worker Thread当中通过Handler发送消息

    public class MainActivity enxtends Activity {
    	private Textview textview;
    	private Button button;
    	private Handler handler; //3. 定义一个变量
    	@Override
    	protected void conCreate(Bundle savedInstanceState) {
    		super.onCreate(savedINstanceState);
    		setContentView(R.layout.activity_main);
    
    		textView = (TextView)findViewById(R.id.textViewId);
    		button = (Button)findViewById(R.id.buttonId);
    
    		handler = new Myhandler(); //4.使用Myhandler类生成对象
    
    		button.setOnClickListener(new ButtonListener());//绑定监听器
    	}
    
    	class MyHandler extends Handler { 
    		//1.首先定义一个handler的实现类,继承Handler
    		@Override
    		public void handleMessage(Message msg) {
    			//2. 然后实现handleMessage方法
    
    			System.out.println("handleMessage--->" + Thread.currentThread().getName()); // 测试说明:打印当前线程的名字
    
    			String s= (String)msg.obj; // 8. 在主线程中将数值取出
    			textView.setText(s); //在主线程中操作UI
    
    		}
    	}
    
    	class ButtonListener implements OnClickListener {
    
    		@Override
    		public void onClick(View v) {
    			Thread t = new NetWorkThread();
    			t.start();
    		}
    	}
    
    	class NetworkThread extends Thread {
    		//本线程为Worker Thread
    		//@Override
    		public void run(){
    
    			System.out.println("network--->" + Thread.currentThread().getName()); // 测试说明:打印当前线程的名字
    
    			//模拟访问网络,所以当线程运行时,首先休眠2秒
    			try {
    				Thread.sleep(2 * 1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			//变量s的值,模拟从网络中获取的数据
    			String s = "网络中的数据";
    			//textView.setText(s);//这样的操作是错误的,安卓系统中UI操作原则上只能在主线程中进行
    
    			Message msg = handler.obtainMessage(); // 5.生成Message对象
    			//sendMessage方法无论在主线程中发送还是在Worker Thread中发送都可以,这里在WorkerThread当中发送,然后在主线程将消息取出。
    			msg.obj = s; // 6. 把s赋值给obj
    			handler.sendMessage(msg); // 7. 调用sendMessage方法发送消息
    
    		}
    	}
    
    }
  • 相关阅读:
    左右下划线,中间文字
    sql语言动词
    SQL语言的四个组成部分
    MySQL执行一条查询语句的内部执行过程
    07 | 行锁功过:怎么减少行锁对性能的影响?
    06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
    05 | 深入浅出索引(下)
    04 | 深入浅出索引(上)
    03 | 事务隔离:为什么你改了我还看不见?
    02 | 日志系统:一条SQL更新语句是如何执行的?
  • 原文地址:https://www.cnblogs.com/gcy77/p/4047851.html
Copyright © 2011-2022 走看看