当前位置:  编程技术>移动开发
本页文章导读:
    ▪视图控制器的创建-将视图控制器添加到UIWindow下        视图控制器的创建-将视图控制器添加到UIWindow上 ios第一个程序hello world 层次关系 -- 创建一个空应用程序-添加一个类RootViewController-添加一个视图RootView.xib— ......
    ▪ Looper中的睡眠等候与唤醒机制        Looper中的睡眠等待与唤醒机制Looper中的睡眠等待与唤醒机制 C++类Looper中的睡眠和唤醒机制是通过pollOnce和wake函数提供的,它们又是利用操作系统(Linux内核)的epoll机制来完成的。当被监控的.........
    ▪ 点击cell展示cell的细节       点击cell显示cell的细节实现的功能:点击cell显示cell的详细信息,再次点击关闭cell的详细信息。 #import <UIKit/UIKit.h> @interface MyCell : UITableViewCell {     UILabel *lab_info;     UILabel *lab_detailInf.........

[1]视图控制器的创建-将视图控制器添加到UIWindow下
    来源: 互联网  发布时间: 2014-02-18
视图控制器的创建-将视图控制器添加到UIWindow上


ios第一个程序hello world



层次关系


--



创建一个空应用程序-添加一个类RootViewController-添加一个视图RootView.xib—





    
[2] Looper中的睡眠等候与唤醒机制
    来源: 互联网  发布时间: 2014-02-18
Looper中的睡眠等待与唤醒机制

Looper中的睡眠等待与唤醒机制

C++类Looper中的睡眠和唤醒机制是通过pollOnce和wake函数提供的,它们又是利用操作系统(Linux内核)的epoll机制来完成的。当被监控的文件(通过epoll_ctl的EPOLL_CTL_ADD添加进去)可I/O时,epoll_wait调用会从睡眠中醒来,这时,可以检查是哪个(或哪些)文件描述符对应的文件可以进行I/O读写了,从而做出进一步处理。使用者利用它们就可以拥有睡眠等待和唤醒机制。下面详述。

在Looper的构造函数中,会创建一个管道(下面的行73),然后调用epoll_create获取一个epoll的实例的描述符(行88),最后将管道读端描述符作为一个事件报告项添加给epoll(行95)。这样,当管道读端有数据可读时,将会得到报告。Looper的构造函数如下(见文件Looper.cpp):


Looper的pollOnce函数将最终调用到其pollInner函数。在后者里面,将调用epoll_wait睡眠等待其监控的文件描述符是否有可I/O事件的到来,若有(哪怕只有一个),epoll_wait将会醒来,然后可检查是哪个文件描述符上的可I/O事件。pollInner函数中的相关代码如下(见文件Looper.cpp):



可见,在线程循环中调用了Looper的pollOnce函数,将导致睡眠等待在上面的行218处的epoll_wait上。当向消息队列发送消息并进行唤醒时,行218将被唤醒,因此从pollOnce函数中返回,可以从消息队列中取出消息进行处理。

Looper的wake函数用于向管道中写入字符(下面的行367),以唤醒pollOnce:


下面来看一下Java层的MessageQueue如何利用这种机制。

前面提到在android.os.MessageQueue的next函数中取出下一个消息时,会调用到native层实现的函数nativePollOnce时,实际调用到了如下native实现(见文件android_os_MessageQueue.cpp):


上面行157的pollOnce函数代码是(见文件android_os_MessageQueue.cpp):


这样,它们就通过Looper的pollOnce实现了在Looper中的管道上的读端上的睡眠等待。

当android.os.MessageQueue的enqueueMessage函数往队列上添加了一个新消息或removeSyncBarrier移除了同步屏障后,可能需要调用nativeWake唤醒,其native实现为:(见文件android_os_MessageQueue.cpp):


上面的行162调用的又是下面的函数,代码如下(见文件android_os_MessageQueue.cpp):


这样,Looper将向管道写端写入字符,唤醒其在管道读端上的睡眠等待。

因此,通过借助于Looper的wake和pollOnce函数,可以让别的消息队列(如Java层的消息队列)拥有睡眠唤醒机制:没有消息时pollOnce调用者将睡眠等待,有消息时让wake函数去唤醒睡眠等待。


本文节选自《深入剖析Android系统》一书

杨长刚著

电子工业出版社出版


    
[3] 点击cell展示cell的细节
    来源: 互联网  发布时间: 2014-02-18
点击cell显示cell的细节

实现的功能:点击cell显示cell的详细信息,再次点击关闭cell的详细信息。

#import <UIKit/UIKit.h>


@interface MyCell : UITableViewCell
{
    UILabel *lab_info;
    UILabel *lab_detailInfo;
    CGFloat normalHeight;
}
@property (retain,nonatomic)UILabel *lab_info,*lab_detailInfo;
@property CGFloat normalHeight;
-(CGFloat)getMyCellHeight;
-(void)resetCellHeight;

@end


#import "MyCell.h"
@interface MyCell()
{
}
@end
@implementation MyCell

@synthesize lab_info,lab_detailInfo;
@synthesize normalHeight;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        lab_info=[[UILabel alloc]init];
        [self.contentView addSubview:lab_info];
        //
        self.normalHeight=self.frame.size.height;
        //
        lab_detailInfo=[[UILabel alloc]init];
        lab_detailInfo.lineBreakMode=NSLineBreakByCharWrapping;
        lab_detailInfo.numberOfLines=5;
        [self.contentView addSubview:lab_detailInfo];
        //
        self.layer.shadowColor=[UIColor blackColor].CGColor;
        self.layer.shadowOffset=CGSizeMake(0, 2);
        self.layer.shadowOpacity=0.3;
        self.layer.shadowRadius=2;
        //
        
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
}
-(CGFloat)getDetailLabViewHeight
{
    [self.lab_detailInfo sizeToFit];
    return self.lab_detailInfo.frame.size.height;;
}
-(CGFloat)getMyCellHeight
{
    return normalHeight +[self getDetailLabViewHeight];
}

-(void)resetCellHeight
{
    [self layoutIfNeeded];
    CGRect cellFrame=self.frame;
    cellFrame.size.height=normalHeight+[self getDetailLabViewHeight];
    [self setFrame:cellFrame];
}
-(void)layoutSubviews
{
    [super layoutSubviews];
    //设置标题的lab的高度
    CGRect lab_info_Frame=CGRectInset(self.frame, 0, 0);
    lab_info_Frame.origin.x=lab_info_Frame.origin.y=0;
    lab_info_Frame.size.height=normalHeight;
    [lab_info setFrame:lab_info_Frame];
    //设置详细信息的高度
    CGRect lab_detailInfo_Frame=CGRectInset(self.frame, 0, 0);
    lab_detailInfo_Frame.origin.x=0;
    lab_detailInfo_Frame.origin.y=normalHeight;
    lab_detailInfo_Frame.size.height=[self getDetailLabViewHeight];
    [lab_detailInfo setFrame:lab_detailInfo_Frame];
    //
    //[self setNeedsDisplay];
}
-(void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    self.contentView.backgroundColor=[UIColor grayColor];
    lab_info.backgroundColor=[UIColor clearColor];
    lab_detailInfo.backgroundColor=[UIColor clearColor];
}

@end

#import <UIKit/UIKit.h>
#import "MyCell.h"
@interface RootViewController : UITableViewController
{
    NSMutableArray *isItemSelected;
}


@end


#import "RootViewController.h"

@implementation RootViewController


#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    isItemSelected=[[NSMutableArray alloc]initWithCapacity:5];
    for (int i=0; i<5; i++)
    {
        [isItemSelected insertObject:[NSNumber numberWithBool:NO] atIndex:i];
    }
}

#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 5;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    MyCell  *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = (MyCell*)[[MyCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        cell.selectionStyle=UITableViewCellSelectionStyleNone;
    }

    cell.lab_info.text=[NSString stringWithFormat:@"title-%d",indexPath.row];
    cell.lab_detailInfo.text=[NSString stringWithFormat:@"subtitle-%d",indexPath.row];
    if ([[isItemSelected objectAtIndex:indexPath.row]boolValue]==YES) {
        cell.lab_detailInfo.hidden=NO;
    }else{
       cell.lab_detailInfo.hidden=YES;
    }
    return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    MyCell *cell=(MyCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
    if ([[isItemSelected objectAtIndex:indexPath.row] boolValue]==YES) {
         return [cell getMyCellHeight];
    }
    else
    {
       return cell.normalHeight;    
    }
        
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    BOOL b=[[isItemSelected objectAtIndex:indexPath.row]boolValue];
    [isItemSelected replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:!b]];
    //
    [tableView reloadData];
   // [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
    

}

效果是这样的




    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3