为APP添加一个登录刷新已打开UI机制

为你的APP添加一个统一刷新事件

最近看到一个朋友的博客,写了一篇文章 控制页面刷新小技巧


我觉得我的想法与他的有很大的出入,这里写写我自己的控制刷新事件吧

首先

拿我最近的项目做做例子吧,我们想在登录之后,对所有需要刷新数据的界面做一个统一的刷新,否则明明登录了,但是界面未刷新,会造成用户体验好差。然后我就想出了这么个法子:


1.首先定义一个用于刷新的注解,使用于方法Method上:
OnLoginAction.java


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 当登录的时候,需要调用的方法
 * Created by xiaolei on 2017/4/12.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLoginAction
{
}


2.为所有需要刷新数据的界面,定义一个协议代理,就是接口。
UIDataDelegate.java


/**
 * Created by xiaolei on 2017/4/12.
 */
public interface UIDataDelegate
{
}

这个接口我们啥方法都不写,只是作为一个单纯的标识而已,后面会用到。


3.定义一个用于刷新界面的广播

LoginRecever.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.tianjs.tianjinsuop2p.base.UIDataDelegate;
import java.lang.ref.SoftReference; 
import java.lang.reflect.Method;
/**
 * Created by xiaolei on 2017/4/12.
 */
public class LoginRecever extends BroadcastReceiver
{
    private static final String TAG = "LoginRecever";
    private SoftReference<UIDataDelegate> uiDataInterface;
    public static final String ACTION = "com.tianjs.p2p.login.action";
    public LoginRecever(UIDataDelegate uiDataDelegate)
    {
        this.uiDataInterface = new SoftReference<>(uiDataDelegate);
    }
    @Override
    public void onReceive(Context context, Intent intent)
    {
        
    }
}

这里我们定义构造函数,传入的参数,就是第二点定义的那个协议代理。UIDataDelegate


4.把我们的BaseActivity实现 implements 我们定义的协议接口 UIDataDelegate
BaseActivity.java

public abstract class BaseActivity extends Activity implements UIDataDelegate
{
    
}

5.在BaseActivity的onCreate和onDestory分别对广播的初始化,注册,以及 销毁时的注销
BaseActivity.java

import android.app.Activity;
import com.tianjs.tianjinsuop2p.Receivers.LoginRecever;

public abstract class BaseActivity extends Activity implements UIDataDelegate
{
    private LoginRecever recever;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        recever = new LoginRecever(this);
        LocalBroadcastManager.getInstance(this).registerReceiver(recever,new IntentFilter(LoginRecever.ACTION));
    }
    
    @Override
    protected void onDestroy()
    {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(recever);
        super.onDestroy();
    }
}

这里我需要提一下,我注册广播使用的是 V4包的,这样的话,这个广播,只在本进程内有效

LocalBroadcastManager.getInstance(this).registerReceiver(recever,null);

6.关键代码来了,以上我们定义了一个统一的界面BaseActivity 一个用于执行动作的广播 LoginRecever 一个统一需要操作界面的接口 UIDataDelegate 和一个 自己定义的注解 @OnLoginAction

到此为止,我们可以试用一下

import android.widget.TextView;
import com.tianjs.tianjinsuop2p.R;
import com.tianjs.tianjinsuop2p.base.BaseActivity;
/**
 * 需要在登录之后自动刷新的,已打开的界面
 * Created by xiaolei on 2017/3/20.
 */
public class DataActivity extends BaseActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alert);
    }
    
    @OnLoginAction
    public void loadData()
    {
        Log.e("DataActivity","刷新数据")
    }
}

登录成功之后,发送广播操作:

Intent intent = new Intent();
intent.setAction(LoginRecever.ACTION);
LocalBroadcastManager.getInstance(LoginActicity.this).sendBroadcast(intent);

到此为止,我们算是已经完成了 50%的工作量了,那么,如何在发送广播之后,自动调用这个被@OnLoginAction注解的方法呢?

7.划重点啊,这里是关键的代码:

找到我们上面定义的 LoginRecever.java,既然是响应广播操作嘛,肯定跟这个广播接收器有关。
我们刚才是不是把已经实现UIDataDelegate接口传进LoginRecever里面来了吗?那么,我们这里可以这么做:


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.tianjs.tianjinsuop2p.annotations.OnLoginAction;
import com.tianjs.tianjinsuop2p.base.UIDataDelegate;
import com.tianjs.tianjinsuop2p.config.Globals;
import com.tianjs.tianjinsuop2p.utils.Log;

import java.lang.ref.SoftReference; 
import java.lang.reflect.Method;

/**
 * Created by xiaolei on 2017/4/12.
 */

public class LoginRecever extends BroadcastReceiver
{
    private static final String TAG = "LoginRecever";
    private SoftReference<UIDataDelegate> uiDataInterface;
    public static final String ACTION = "com.tianjs.p2p.login.action";

    public LoginRecever(UIDataDelegate uiDataDelegate)
    {
        this.uiDataInterface = new SoftReference<>(uiDataDelegate);
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent != null && intent.getAction() != null && intent.getAction().equals(ACTION) && uiDataInterface != null && uiDataInterface.get() != null)
        {
            UIDataDelegate delegate = uiDataInterface.get();
            Class<?> klass = delegate.getClass();
            Log.e(TAG, "LoginRecever:" + klass.getSimpleName());
            Method methods[] = klass.getDeclaredMethods();
            if (methods != null)
            {
                for (Method method : methods)
                {
                    if(method.isAnnotationPresent(OnLoginAction.class) && method.getParameterTypes().length == 0)
                    {
                        try
                        {
                            method.invoke(delegate,new Object[]{});
                        }catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}

这里会自动寻找当前类,里面所有的方法,并且过滤筛选出被 @OnLoginAction注解的方法,还必须是无参数的。
这里使用了软引用,可以避免你的activity回收不了的情况


大功告成 !


没图我说个J8??

输入图片说明
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,232评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,555评论 18 139
  • 当我手捧这本描述沙巴这一热带地区的《风下之乡》时,国内包括我所在的这座内陆城市在内的许多地区都正在经历强厄尔尼诺带...
    奇妙动物小兔子阅读 577评论 0 5
  • 阴阳失调 除了前面分组讲到的以外,剩下的还有三组: 第一组是:三阴三阳,但阴阳有不配的情形,一共十二个,在我的《周...
    田园读书人阅读 1,206评论 4 16
  • 2015年圣诞节,和小伙伴们冰岛自驾。 这是一次凄惨的旅行,经过这次旅行,我们更坚强了。 飞机一到,我们就去雷克雅...
    我是青蛙我怕啥阅读 393评论 0 0