我常用的BaseHandler

本文介绍了一种在Android开发中减少Handler类冗余代码的方法——BaseHandler的设计与实现。通过定义通用的Handler处理逻辑,如请求成功、失败等场景,提高了代码复用性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android开发过程中,我们不免会使用Handler类用来处理多线程发来的消息。

一般使用过程中,我们在Activity中定义MyHandler extends Hanlder,并重写了handleMessage方法,在多线程的地方通过sendMessage的方式发送消息,在handlerMessage里使用

</pre><pre name="code" class="java">switch(msg.what)
{ 
case 1:break; 
case2:break;
}
的方式进行分发处理。

码了几个MyHandler你会发现,他们基本上都会处理“请求成功”,“请求失败”,“发送通知”等相关事务。所以为了减少冗余代码,在MyHandler之上定义一个BaseHandler是很有必要的。

BaseHandler的作用:

  1. 封装全局适用的消息msg.whatKEY),例如:定义发送通知的KEY = 1000
  2. 处理全局适用的消息。 例如:可以在BaseHandler里处理发送通知的消息。
  3. 定义对所有Handler适用的方法。
  4. ...

实现方式很简单。下面是之前使用过的一个BaseHandler,因为大量使用了SwipeRefreshLayout,所以我把该控件的状态更新也放到了BaseHandler中进行处理。

public class BaseHandler extends Handler {
    private static final String TAG = "BaseHandler";
    protected Context context;
    protected SwipeRefreshLayout mSwipeRefreshLayout;

    protected Snackbar snackbar;

    public BaseHandler(Context context, SwipeRefreshLayout mSwipeRefreshLayout){
        this.context = context;
        this.mSwipeRefreshLayout = mSwipeRefreshLayout;
    }

    public static final int KEY_TOAST = 1000;
    public static final int KEY_TOAST_LONG = 1001;
    public static final int KEY_DISSMISS_PROGRESS = 1002;
    public static final int KEY_NEED_LOGGED = 1003;
    public static final int KEY_ERROR = 2001;
    public static final int KEY_SUCCESS = 2000;
    public static final int KEY_NO_RES = 2002;
    public static final int KEY_PARSE_ERROR = 2003;

    /**
     * 获取七牛token成功是发送该消息
     */
    public static final int KEY_GET_QINIU_TOKEN_SUC = 3001;
    /**
     * 给trend 点赞
     */
    public static final int KEY_LIKE_TREND = 3002;
    /**
     * 给trend 取消点赞
     */
    public static final int KEY_UNLIKE_TREND = 3003;
    /**
     * 获取用户的trend
     */
    public static final int KEY_GET_TREND_LIST_SUC = 3004;
    /**
     * 获取用户粉丝
     */
    public static final int KEY_GET_FENSI_SUC = 3005;
    /**
     * 获取用户关注
     */
    public static final int KEY_GET_GUANZHU_SUC = 3006;
    /**
     * 获取用户简要信息
     */
    public static final int KEY_GET_BRIEFUSER_SUC = 3007;
    /**
     * 获取gym列表成功
     */
    public static final int KEY_GET_GYM_LIST_SUC = 3008;
    /**
     * 获取用户简要信息
     */
    public static final int KEY_GET_RECOMMENDUSER_SUC = 3009;

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        Log.d(TAG, "BaseHandler开始及处理");

        switch (msg.what){
            case KEY_ERROR:
                if (context != null){
                    Toast.makeText(context, (String) msg.obj, Toast.LENGTH_SHORT).show();
                }
                if (mSwipeRefreshLayout != null){
                    mSwipeRefreshLayout.setRefreshing(false);
                }
                break;
            case KEY_PARSE_ERROR:
                if (context != null){
                    Toast.makeText(context, "数据出错了,再试试", Toast.LENGTH_SHORT).show();
                }
                if (mSwipeRefreshLayout != null){
                    mSwipeRefreshLayout.setRefreshing(false);
                }
                break;
            case KEY_NO_RES:
                if (context != null){
                    Toast.makeText(context, "无法连接到服务器", Toast.LENGTH_SHORT).show();
                }
                if (mSwipeRefreshLayout != null){
                    mSwipeRefreshLayout.setRefreshing(false);
                }
                break;
            case KEY_TOAST:
                if (context != null){
                    if(snackbar == null) {
                        snackbar = Snackbar.make(((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content)
                                , (String) msg.obj
                                , Snackbar.LENGTH_SHORT);
                        snackbar.show();
                    } else{
                        snackbar.setText((String) msg.obj);
                        snackbar.show();
                    }
                }
                break;
            case KEY_TOAST_LONG:
                if (context != null){
                    Snackbar.make(((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content)
                            , (String) msg.obj
                            , Snackbar.LENGTH_LONG).show();
                }
                break;
            case KEY_DISSMISS_PROGRESS:
                try {
                    ((BaseAppCompatActivity) context).dissmissProgress();
                } catch(Exception e){

                }
                break;

            case KEY_NEED_LOGGED:
                TwoOptionMaterialDialog md_login_register = MaterialDialogFactory.createLoginOrRegisterMd(context);
                md_login_register.show();
                break;
        }
    }

    public void sendToast(String content){
        Message msg = Message.obtain();
        msg.what = KEY_TOAST;
        msg.obj = content;
        this.sendMessage(msg);
    }

    public void sendToastLong(String content){
        Message msg = Message.obtain();
        msg.what = KEY_TOAST_LONG;
        msg.obj = content;
        this.sendMessage(msg);
    }

    public void sendDisMissProgress(){
        Message msg = Message.obtain();
        msg.what = KEY_DISSMISS_PROGRESS;
        this.sendMessage(msg);
    }
}


### 关于 `BaseHandler` 的概述 在 Python 中,`BaseHandler` 并不是一个内置的标准库组件,但它通常出现在某些框架或特定场景下。以下是关于其可能的作用和使用方法: #### 1. **作为 Web 框架的一部分** 在许多流行的 Web 开发框架中(例如 Tornado 或 Django),`BaseHandler` 可能是一个基础类,用于定义请求处理程序的行为模式。它通常是开发者自定义处理器的父类。 - 在 Tornado 框架中,`tornado.web.RequestHandler` 是一个类似的基类[^5]。开发者可以通过继承该类来创建自己的 HTTP 请求处理器。 ```python from tornado.web import RequestHandler, Application class MyCustomHandler(RequestHandler): def get(self): self.write("Hello, world!") app = Application([ (r"/", MyCustomHandler), ]) ``` 在这里,`RequestHandler` 类似于其他框架中的 `BaseHandler`,提供了诸如响应客户端、读取查询参数等功能。 --- #### 2. **作为 WebSocket 处理的基础类** 如果提到的是类似于引用[4]中的内容,则可以推测 `BaseWebSocket` 和 `PushWebSocket` 都可能是基于某个 `BaseHandler` 实现的具体子类。在这种情况下,`BaseHandler` 提供了一些通用的功能支持,而具体的实现则由子类完成。 假设我们有一个简单的 WebSocket 应用程序结构如下所示: ```python class BaseWebSocket: def on_message(self, message): raise NotImplementedError() def send_message(self, message): pass class CustomWebSocket(BaseWebSocket): def on_message(self, message): print(f"Received Message: {message}") self.send_message("Echo: " + message) # 路由配置 urlpatterns = [ ('/websocket/', CustomWebSocket()), ] ``` 在这个例子中,`BaseWebSocket` 定义了一个接口并提供了一部分功能,具体逻辑交给了子类去扩展。 --- #### 3. **类型提示与静态分析的支持** 虽然未直接提及 `BaseHandler` 是否涉及类型标注,但从引用[2]可以看出,Python 支持通过 `typing` 模块为对象添加类型信息。这有助于提高代码可维护性和减少运行时错误。 假如我们在设计 `BaseHandler` 时希望加入类型提示,可以这样写: ```python from typing import Optional class BaseHandler: request: dict[str, str] def __init__(self, request: dict[str, str]): self.request = request def handle_request(self) -> Optional[str]: """Handle incoming requests.""" return None ``` 上述代码片段展示了如何利用 `typing` 来增强 `BaseHandler` 的清晰度和可用性。 --- #### 4. **渲染模板与编码设置** 根据引用[3]的内容可知,在某些情境下,`render()` 方法可能会依据设定的不同返回字符串或者字节流数据。因此当构建一个完整的 `BaseHandler` 解决方案时,也需要考虑这些细节。 下面展示一段综合了以上特性的示例代码: ```python class BaseHandler: output_encoding: Optional[str] = 'utf-8' def render(self, template_name: str, context: dict) -> str | bytes: rendered_content = f"<html>{template_name} with data {context}</html>" if self.output_encoding is not None: return rendered_content.encode(self.output_encoding) else: return rendered_content handler_instance = BaseHandler() output = handler_instance.render('index.html', {'title': 'Sample Page'}) print(output.decode() if isinstance(output, bytes) else output) ``` 此案例说明了如何灵活调整输出形式以满足不同需求。 --- ### 总结 尽管没有明确指出哪个版本或框架下的 `BaseHandler` 正确含义是什么样的,但可以根据上下文推断出它的主要职责在于抽象化公共行为以便重用,并且能够适配多种应用场景如 RESTful API 或实时通信协议等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值