android单例中的监听如何回调

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android单例中的监听如何回调相关的知识,希望对你有一定的参考价值。

参考技术A 1) OnClickListener 接口
此接口处理的是单击事件,例如,在 View 上进行单击动作,在 View 获得焦点的情况下单击“确定”按钮或者单击轨迹球都会触发该事件。
当单击事件发生时,OnClickListener 接口会回调 public void onClick(View v) 方法对事件进行处理。其中参数 v 指的是发生单击事件的 View 组件。
2) OnLongClickListener 接口
此接口处理的是长按事件,当长时间按住某个 View 组件时触发该事件。
其对应的回调方法为 public boolean onLongClick(View v),当返回 true 时,表示已经处理完此事件,若事件未处理完,则返回 false,该事件还可以继续被其他监听器捕获并处理。
3) OnFocusChangeListener 接口
此接口用于处理 View 组件焦点改变事件。当 View 组件失去或获得焦点时会触发该事件。
其对应的回调方法为 public void onFocusChange(View v, Boolean hasFocus),其中参数 v 表示产生事件的事件源,hasFocus 表示事件源的状态,即是否获得焦点。
4) OnKeyListener 接口
此接口用于对手机键盘事件进行监听,当View获得焦点并且键盘被敲击时会触发该事件。
其对应的回调方法为 public boolean onKey(View v, int keyCode, KeyEvent event)。

无法为单例中的 BOOL 字段赋值

【中文标题】无法为单例中的 BOOL 字段赋值【英文标题】:Can't assign value to a BOOL field in a Singleton 【发布时间】:2011-08-13 16:19:48 【问题描述】:

我有这个单身人士:

UserData.h

@interface UserData : NSObject 
    User *user;


+ (UserData *)sharedUserData;

@property (nonatomic, retain) User *user;

UserData.m

@implementation UserData

@synthesize user;

SYNTHESIZE_SINGLETON_FOR_CLASS(UserData);

- (id) init

    self = [super init];
    if (self != nil) 
    
    return self;


- (void) dealloc

    [user release];
    [super dealloc];


@end

User.h

@interface User : NSObject

    int user_id;
    NSString *username;
    BOOL logged_in;


@property (nonatomic, assign) int user_id;
@property (nonatomic, retain) NSString *username;
@property (nonatomic, assign, getter=isLogged) BOOL logged_in;

@end

User.m

@implementation User

@synthesize user_id, username, logged_in;

- (id)init

    self = [super init];
    if (self) 
        // Initialization code here.
    

    return self;


@end

在应用委托中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window.rootViewController = self.tabBarController;

    BOOL logged_in = FALSE; // hardcoded for testing  

    UserData *userData = [UserData sharedUserData];
    [[userData user] setLogged_in:logged_in];

    if (!logged_in) 
        [self hideTabBar:self.tabBarController];
    

    [self.window makeKeyAndVisible];
    return YES;

到这里为止,它就像一个魅力。问题是在LoginViewController 中我更改了logged_in 的值:

BOOL logged_in = TRUE;    

UserData *userData = [UserData sharedUserData];
[[userData user] setLogged_in:logged_in];

if (userData.user.isLogged) 
    NSLog(@"You're logged in.");
 else 
    NSLog(@"You're not logged in.");

调试控制台提示我“您尚未登录”。为什么这个?怎么了?

【问题讨论】:

您可能希望在其初始化中为您的单例的可变用户分配内存。 【参考方案1】:
- (id) init

    self = [super init];
    if (self != nil) 
      self.user = [[User alloc] init];
    
    return self;

您还需要为单例的单个元素分配内存。

【讨论】:

谢谢!奇迹般有效。 :)

以上是关于android单例中的监听如何回调的主要内容,如果未能解决你的问题,请参考以下文章

源码解析Android中的事件处理

android中的回调

Android dialog实现监听生命周期

Android性能优化--冷启动优化(Application)

Android 基于回调的事件处理机制详解

Android事件处理