Android事件处理

基于监听事件处理

1.内部类作为事件监听器类
2.外部类作为事件监听器类

较少见,不利于提高程序内聚性,外部类也不能自由访问activity中的组件

3.Activity本身作为事件监听器

实现事件监听器接口

4.匿名内部类作为事件监听器
5.直接绑定到标签

onClick属性


基于回调事件处理

为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法,当进行操作事件时系统会回调相应的方法

public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyLongPress(int keyCode, KeyEvent event) 
public boolean onKeyShortcut(int keyCode, KeyEvent event) 
public boolean onKeyUp(int keyCode, KeyEvent event) 
public boolean onTouchEvent(MotionEvent event)
......

关于回调事件处理方法的返回值

1.返回true,表示事件已经完全被处理/消耗,该事件不会传播出去
2.返回false,表示未完全处理该事件,该事件会传播出去

如果既有监听事件又有回调事件,那么首先触发监听事件,接着才会触发回调事件


响应的系统设置事件

Configuration类:用于描述手机设备上的配置信息

frameworks/base/core/java/android/content/res/Configuration.java
Configuration config = getResources().getConfiguration();
public float fontScale; //获取设置的字体
public int mcc; //获取移动信号的国家码
public int mnc; //获取移动信号的网络码
public Locale locale; //获取用户当前的Locale
public int orientation; //获取系统屏幕的方向

监听系统配置信息变化

重写Activity的onConfigurationChanged(Configuration newConfig)方法
当屏幕方向改变,语言改变..时会回调该方法


Handler消息传递机制

Handler类的主要作用有两个:

1.在新启动的线程中发送消息
2.在主线程中获取,处理消息

与Handler一起工作的几个组件

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

Looper、MessageQueue、Handler作用

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

Handler使用

// 1.主线程中创建一个Handler对象
Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg){ //处理代码 }
};
// 2.子线程中发送消息
mHandler.sendEmptyMessage(0x1233);


异步任务(AsyncTask)

使用AsyncTask三步:

1.创建AsyncTask的子类,并为三个泛型参数
  Params:启动任务执行的输入参数类型
  Progress:后台任务完成的进度值的类型
  Result:后台执行任务完成后返回结果的类型
2.根据需要,实现AsyncTask的方法
  doInBackground() //重写该方法就是后台线程将要完成的任务
  onProgressUpdate() //在doInBackground()方法中调用publishProgress更新进度后会触发该方法
  onPreExecute() //在执行后台耗时操作前被调用
  onPostExecute() //当doInBackground()方法完成后会自动调用该方法,并将doInBackground()返回值传给该方法
3.调用AsyncTask子类的实例的execute(Params...params)开始执行耗时任务。

使用AsyncTask时必须遵守的规则:

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

AsyncTask Demo

/***************异步下载****************/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class AsyncTaskTest extends Activity {
    private TextView show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (TextView) findViewById(R.id.show);
    }

    // android:onClick="download"
    public void download(View source) throws MalformedURLException {
        DownTask task = new DownTask(this);
        task.execute(new URL("http://www.baidu.com"));
    }

    class DownTask extends AsyncTask<URL, Integer, String>
    {
        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 connection = params[0].openConnection();
                // 打开connection连接对应的输入流,并将它包装成BufferedReader
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        connection.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]);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值