安卓基础学习_Android事件处理

一、基于监听事件处理
1.内部类作为事件监听器类,
2.外部类作为事件监听器类。
3.Activity本身作为事件监听器。
4.匿名内部类作为事件监听器。
5.直接绑定到标签

// 获取应用程序中的bn按钮
Button bn = (Button) findViewById(R.id.bn);
// 为按钮绑定事件监听器。
bn.setOnClickListener(new MyClickListener()); // ①
// 定义一个单击事件的监听器
class MyClickListener implements View.OnClickListener //内部类作为事件监听器类
{
	// 实现监听器类必须实现的方法,该方法将会作为事件处理器
	@Override
	public void onClick(View v)
	{
		...
	}
}

//Activity本身作为事件监听器
// 实现事件监听器接口
public class ActivityListener extends Activity implements OnClickListener
{
	......
	// 实现事件处理方法
	@Override
	public void onClick(View v)
	{
		......
	}
}

// 匿名内部类作为事件监听器
bn.setOnClickListener(new OnClickListener()
{
	// 实现事件处理方法
	@Override
	public void onClick(View v)
	{
		...
	}
});

<!-- 在标签中为按钮绑定事件处理方法 -->
<Button
	... 
	android:onClick="clickHandler"
/>
// 定义一个事件处理方法
// 其中source参数代表事件源
public void clickHandler(View source)
{
	...
}

二、基于回调事件处理
为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法。
public class MyButton extends Button
{
	public MyButton(Context context, AttributeSet set)
	{
		super(context, set);
	}
	@Override //onKeyDown方法为回调方法
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		super.onKeyDown(keyCode, event);
		Log.v("-crazyit.org-", "the onKeyDown in MyButton");
		/***基于回调的时间传播
		// 返回true,表明该事件不会向外扩散
		//若返回false,表明该方法为完全处理该事件,该事件会扩散出去
		***/
		return true;
	}
}

三、响应的系统设置事件
/****动态切换手机屏幕******/
Configuration config = getResources().getConfiguration();
// 如果当前是横屏
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE)
{
	// 设为竖屏
	ChangeCfg.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
// 如果当前是竖屏
if (config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
	// 设为横屏
	ChangeCfg.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

<!-- 设置Activity可以监听屏幕方向改变的事件 -->
<activity android:configChanges="orientation" ...

四、Handler消息传递机制
Handler类的主要作用有两个:
1>.在新启动的线程中发送消息
2>.在主线程中获取,处理消息

与Handler一起工作的几个组件
1>.Message:Handler接收和处理的消息对象。
2>.Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读取到之后就把消息交给发送该消息的Handler进行处理。
3>.MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。

Looper、MessageQueue、Handler作用
1>.Looper:每个线程只能拥有一个Looper。它负责管理MessageQueue,会不断地从MessageQueue中取出消息,将消息分给对应的Handler去处理。
2>.MessageQueue:由Looper负责管理。它采用先进先出的方式来管理Message。
3>.Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。

final Handler myHandler = new Handler()
{
	@Override
	public void handleMessage(Message msg)
	{
		// 如果该消息是本程序所发送的
		if (msg.what == 0x1233)
		{
			// 动态地修改所显示的图片
			show.setImageResource(imageIds[currentImageId++% imageIds.length]);
		}
	}
};
// 定义一个计时器,让该计时器周期性地执行指定任务
new Timer().schedule(new TimerTask()
{
	@Override
	public void run()
	{
		// 发送空消息
		myHandler.sendEmptyMessage(0x1233);
	}
}, 0, 1200);

五、异步任务(AsyncTask)
不要在UI线程中执行耗时的操作
使用AsyncTask三步:
1>.创建AsyncTask的子类,并为三个泛型参数(Params:启动任务执行的输入参数类型;Progress:后台任务完成的进度值的类型;Result:后台执行任务完成后返回结果的类型)指定类型,不需要可指定为void.
2>.根据需要,实现AsyncTask的方法:
doInBackground(),onProgressUpdate(),onPreExecute(),onPostExecute()
3>.调用AsyncTask子类的实例的execute(Params...params)开始执行耗时任务。

使用AsyncTask时必须遵守的规则:
1>.必须在UI线程中创建AsyncTask的实例。
2>.必须在UI线程中调用AsyncTask的exceute()方法。
3>.AsyncTask的方法不应该由程序员代码调用,而是由android系统负责调用
doInBackground(),onProgressUpdate(),onPreExecute(),onPostExecute()。
4>.每个AsyncTask只能被执行一次,多次调用将会引发异常。

/***************异步下载****************/
public class AsyncTaskTest extends Activity
{
	private TextView show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (TextView) findViewById(R.id.show);
	}
	// 重写该方法,为界面的按钮提供事件响应方法
	public void download(View source) throws MalformedURLException
	{
		DownTask task = new DownTask(this);
		task.execute(new URL("http://www.crazyit.org/ethos.php"));
	}
	class DownTask extends AsyncTask<URL, Integer, String>
	{
		// 可变长的输入参数,与AsyncTask.exucute()对应
		ProgressDialog pdialog;
		// 定义记录已经读取行的数量
		int hasRead = 0;
		Context mContext;
		public DownTask(Context ctx)
		{
			mContext = ctx;
		}
		@Override
		protected String doInBackground(URL... params)
		{
			StringBuilder sb = new StringBuilder();
			try
			{
				URLConnection conn = params[0].openConnection();
				// 打开conn连接对应的输入流,并将它包装成BufferedReader
				BufferedReader br = new BufferedReader(
					new InputStreamReader(conn.getInputStream()
					, "utf-8"));
				String line = null;
				while ((line = br.readLine()) != null)
				{
					sb.append(line + "\n");
					hasRead++;
					publishProgress(hasRead);
				}
				return sb.toString();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			return null;
		}
		@Override
		protected void onPostExecute(String result)
		{
			// 返回HTML页面的内容
			show.setText(result);
			pdialog.dismiss();
		}
		@Override
		protected void onPreExecute()
		{
			pdialog = new ProgressDialog(mContext);
			// 设置对话框的标题
			pdialog.setTitle("任务正在执行中");
			// 设置对话框 显示的内容
			pdialog.setMessage("任务正在执行中,敬请等待...");
			// 设置对话框不能用“取消”按钮关闭
			pdialog.setCancelable(false);
			// 设置该进度条的最大进度值
			pdialog.setMax(202);
			// 设置对话框的进度条风格
			pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			// 设置对话框的进度条是否显示进度
			pdialog.setIndeterminate(false);
			pdialog.show();
		}
		@Override
		protected void onProgressUpdate(Integer... values)
		{
			// 更新进度
			show.setText("已经读取了【" + values[0] + "】行!");
			pdialog.setProgress(values[0]);
		}
	}
}
<uses-permission android:name="android.permission.INTERNET"/>

你可能感兴趣的:(安卓基础学习_Android事件处理)