一、基于监听事件处理 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事件处理
最新推荐文章于 2024-07-15 16:23:25 发布