安卓基础学习_Android事件处理

来源:互联网 发布:lol制作皮肤软件 编辑:程序博客网 时间:2024/05/29 17:04
一、基于监听事件处理1.内部类作为事件监听器类,2.外部类作为事件监听器类。3.Activity本身作为事件监听器。4.匿名内部类作为事件监听器。5.直接绑定到标签// 获取应用程序中的bn按钮Button bn = (Button) findViewById(R.id.bn);// 为按钮绑定事件监听器。bn.setOnClickListener(new MyClickListener()); // ①// 定义一个单击事件的监听器class MyClickListener implements View.OnClickListener //内部类作为事件监听器类{// 实现监听器类必须实现的方法,该方法将会作为事件处理器@Overridepublic void onClick(View v){...}}//Activity本身作为事件监听器// 实现事件监听器接口public class ActivityListener extends Activity implements OnClickListener{......// 实现事件处理方法@Overridepublic void onClick(View v){......}}// 匿名内部类作为事件监听器bn.setOnClickListener(new OnClickListener(){// 实现事件处理方法@Overridepublic 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(){@Overridepublic void handleMessage(Message msg){// 如果该消息是本程序所发送的if (msg.what == 0x1233){// 动态地修改所显示的图片show.setImageResource(imageIds[currentImageId++% imageIds.length]);}}};// 定义一个计时器,让该计时器周期性地执行指定任务new Timer().schedule(new TimerTask(){@Overridepublic 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;@Overridepublic 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;}@Overrideprotected String doInBackground(URL... params){StringBuilder sb = new StringBuilder();try{URLConnection conn = params[0].openConnection();// 打开conn连接对应的输入流,并将它包装成BufferedReaderBufferedReader 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;}@Overrideprotected void onPostExecute(String result){// 返回HTML页面的内容show.setText(result);pdialog.dismiss();}@Overrideprotected 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();}@Overrideprotected void onProgressUpdate(Integer... values){// 更新进度show.setText("已经读取了【" + values[0] + "】行!");pdialog.setProgress(values[0]);}}}<uses-permission android:name="android.permission.INTERNET"/>
原创粉丝点击