当前位置:  编程技术>移动开发
本页文章导读:
    ▪解决Toast重复显示的有关问题        解决Toast重复显示的问题前述: 在很早以前接触Android的时候吧! 就遇到过此类Toast消息重复显示的问题,自定义Toast,显示的位置等等,由于事后没有记录下来,导致今日忘记了,于是百度.........
    ▪ Cordova CLI源码分析(4)——创建工程        Cordova CLI源码分析(四)——创建工程在第一篇分析我们曾经举例,创建一个新工程, cordova create hello hellotest com.xxx.hellotest cli.js文件分析命令行参数后,会走到  else if (cmd == 'create' ||.........
    ▪ session对象跟applicatione对象       session对象和applicatione对象    ASP.NET 的常用对象有:response对象、request对象、application对象、server对象、session对象。下面主要讨论session对象和cookie对象。 session对象     是一个会话,是一.........

[1]解决Toast重复显示的有关问题
    来源: 互联网  发布时间: 2014-02-18
解决Toast重复显示的问题

前述: 在很早以前接触Android的时候吧! 就遇到过此类Toast消息重复显示的问题,自定义Toast,显示的位置等等,由于事后没有记录下来,导致今日忘记了,于是百度了下,看了下 知道怎么写了,但是感觉不是很好,于是乎鼠标不知道点哪里去了,竟然找到以前程序的代码,接下来的工作 当然是copy了!

      在此记录在这里,以便日后忘记,直接写在这里!也希望能帮助到大家,直接copy

    

      第一步:

                自定义Toast类:

        

public class MyToast
{
 private static Context context = null;
 private static Toast toast = null;

 public static Toast getToast(Context context, String hint)
 {

  if (MyToast.context == context)
  {
   toast.cancel();
   toast.setText(hint);
  } else
  {
   MyToast.context = context;
   toast = Toast.makeText(context, hint, Toast.LENGTH_SHORT);
  }
  return toast;
 }
}

 第二步 : 调用传值

        

public class ToastTestActivity extends Activity
{
 private Button button;
 private Context context = this;
 private int i;

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  button = (Button) findViewById(R.id.bt);
  button.setOnClickListener(new OnClickListener()
  {

   @Override
   public void onClick(View v)
   {
    MyToast.getToast(context, "哈哈" + i++).show();
   }
  });
 }
}

 

搞定!

      有关Toast 自定义,显示的位置等等,懒得在找以前的代码了,什么时候用到了这些小知识点在写吧!

 

   

1楼xxm282828前天 08:48其实重点就这么一句话: if (MyToast.context == context)

    
[2] Cordova CLI源码分析(4)——创建工程
    来源: 互联网  发布时间: 2014-02-18
Cordova CLI源码分析(四)——创建工程

在第一篇分析我们曾经举例,创建一个新工程,

cordova create hello hellotest com.xxx.hellotest

cli.js文件分析命令行参数后,会走到

 else if (cmd == 'create' || cmd == 'serve') {

            cordova[cmd].apply(this, tokens);

        }

将会执行create函数

create.js

var path          = require('path'),
    fs            = require('fs'),
    shell         = require('shelljs'),
    platforms     = require('../platforms'),
    help          = require('./help'),
    events        = require('./events'),
    config        = require('./config'),
    lazy_load     = require('./lazy_load'),
    util          = require('./util');

var DEFAULT_NAME = "HelloCordova",
    DEFAULT_ID   = "io.cordova.hellocordova";

/**
 * Usage:
 * create(dir) - creates in the specified directory
 * create(dir, name) - as above, but with specified name
 * create(dir, id, name) - you get the gist
 **/
module.exports = function create (dir, id, name, callback) {
    var options = [];

    if (arguments.length === 0) {
        return help();//src/help.js  读取doc/help.txt内容,在终端显示帮助信息
    }

    // Massage parameters
    var args = Array.prototype.slice.call(arguments, 0);
    //arguments不是数组,但是可以通过arguments.length取到长度
    //Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),
    //但因为arguments不是真正的Array,所以它没有slice这个方法.能用slice方法的,只要有length属性就行。
    //Array.prototype已经被call改成arguments了,因为满足slice执行的条件(有length属性),所以没有报错。
    //简单说作用就是:把arguments这个伪数组转换为真正的数组
    if (typeof args[args.length-1] == 'function') {
        callback = args.pop();
    } else if (typeof callback !== 'function') {
        callback = undefined;
    }
    //判断是否有回调函数
    

    if (args.length === 0) {
        dir = process.cwd();//获得当前路径
        id = DEFAULT_ID;
        name = DEFAULT_NAME;
    } else if (args.length == 1) {
        id = DEFAULT_ID;
        name = DEFAULT_NAME;
    } else if (args.length == 2) {
        name = DEFAULT_NAME;
    } else {
        dir = args.shift();//shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
        id = args.shift();
        name = args.shift();
        options = args;
    }

    // Make absolute.
    dir = path.resolve(dir);

    events.emit('log', 'Creating a new cordova project with name "' + name + '" and id "' + id + '" at location "' + dir + '"');

    var dotCordova = path.join(dir, '.cordova');
    var www_dir = path.join(dir, 'www');

    // Create basic project structure.
    shell.mkdir('-p', dotCordova);
    shell.mkdir('-p', path.join(dir, 'platforms'));
    shell.mkdir('-p', path.join(dir, 'merges'));
    shell.mkdir('-p', path.join(dir, 'plugins'));
    shell.mkdir('-p', www_dir);
    var hooks = path.join(dotCordova, 'hooks');
    shell.mkdir('-p', hooks);
    //创建一系列工作目录
    //当前dir/.cordova , dir/www , dir/platforms, dir/merges ,dir/plugins ,dir/.cordova/hooks 
    

    // Add directories for hooks
    shell.mkdir(path.join(hooks, 'after_build'));
    shell.mkdir(path.join(hooks, 'after_compile'));
    shell.mkdir(path.join(hooks, 'after_docs'));
    shell.mkdir(path.join(hooks, 'after_emulate'));
    shell.mkdir(path.join(hooks, 'after_platform_add'));
    shell.mkdir(path.join(hooks, 'after_platform_rm'));
    shell.mkdir(path.join(hooks, 'after_platform_ls'));
    shell.mkdir(path.join(hooks, 'after_plugin_add'));
    shell.mkdir(path.join(hooks, 'after_plugin_ls'));
    shell.mkdir(path.join(hooks, 'after_plugin_rm'));
    shell.mkdir(path.join(hooks, 'after_prepare'));
    shell.mkdir(path.join(hooks, 'after_run'));
    shell.mkdir(path.join(hooks, 'before_build'));
    shell.mkdir(path.join(hooks, 'before_compile'));
    shell.mkdir(path.join(hooks, 'before_docs'));
    shell.mkdir(path.join(hooks, 'before_emulate'));
    shell.mkdir(path.join(hooks, 'before_platform_add'));
    shell.mkdir(path.join(hooks, 'before_platform_rm'));
    shell.mkdir(path.join(hooks, 'before_platform_ls'));
    shell.mkdir(path.join(hooks, 'before_plugin_add'));
    shell.mkdir(path.join(hooks, 'before_plugin_ls'));
    shell.mkdir(path.join(hooks, 'before_plugin_rm'));
    shell.mkdir(path.join(hooks, 'before_prepare'));
    shell.mkdir(path.join(hooks, 'before_run'));

    // Write out .cordova/config.json file with a simple json manifest
    //使用指定id和name参数写入config.json
    require('../cordova').config(dir, {
        id:id,
        name:name
    });

    var config_json = config.read(dir);
    //读取.cordova/config.json
    
    //finalize函数作用:判断下载的tar包是否完整,删除原有www目录下内容,拷贝新内容到www目录,添加配置文件
    var finalize = function(www_lib) {
        while (!fs.existsSync(path.join(www_lib, 'index.html'))) {
            www_lib = path.join(www_lib, 'www');
            if (!fs.existsSync(www_lib)) {
                var err = new Error('downloaded www assets in ' + www_lib + ' does not contain index.html, or www subdir with index.html');
                if (callback) return callback(err);
                else throw err;
            }
        }
        //删除当前www目录下所以文件
        shell.cp('-rf', path.join(www_lib, '*'), www_dir);
        var configPath = util.projectConfig(dir);
        //获得config.xml路径 www/config.xml
        
        // Add template config.xml for apps that are missing it
        if (!fs.existsSync(configPath)) {
            var template_config_xml = path.join(__dirname, '..', 'templates', 'config.xml');
            shell.cp(template_config_xml, www_dir);
        }
        //如果config.xml不存在,从cli模板目录拷贝此文件到当前应用目录
        
        // Write out id and name to config.xml  id和name写入config.xml
        var config = new util.config_parser(configPath);
        config.packageName(id);
        config.name(name);
        if (callback) callback();
    };

    // Check if www assets to use was overridden.
    if (config_json.lib && config_json.lib.www) {
    	//判断config.josn的lib和www字段是否为空
        events.emit('log', 'Using custom www assets ('+config_json.lib.www.id+').');
        //下载config.json中uri地址的hello-world文件包
        lazy_load.custom(config_json.lib.www.uri, config_json.lib.www.id, 'www', config_json.lib.www.version, function(err) {
            if (err) {
                if (callback) callback(err);
                else throw err;
            } else {
                events.emit('log', 'Copying custom www assets into "' + www_dir + '"');
                //下载成功后拷贝到指定目录
                finalize(path.join(util.libDirectory, 'www', config_json.lib.www.id, config_json.lib.www.version));
            }
        });
    } else {
        // Nope, so use stock cordova-hello-world-app one.
        events.emit('log', 'Using stock cordova hello-world application.');
        //根据platform.js中参数下载默认文件
        lazy_load.cordova('www', function(err) {
            if (err) {
                if (callback) callback(err);
                else throw err;
            } else {
                events.emit('log', 'Copying stock Cordova www assets into "' + www_dir + '"');
                finalize(path.join(util.libDirectory, 'www', 'cordova', platforms.www.version));
            }
        });
    }
};

1)参数解析,创建工作目录:参数存在情况下,按照dir, id, name,这几个参数指定内容创建目录,并将id和name参数写入config.json文件。

hello/

|--.cordova/

| | -- hooks/

| | -- config.json

|-- merges/

|-- www/

| `-- config.xml

|-- platforms/

`-- plugins/

在.cordova/hooks目录下创建了很多以事件名称命名的目录,如after_build ,after_compile等,在这些目录下,用户可以添加自定义文件,当这些系统事件发生时,这些目录下的文件相当于回调函数,会被执行

这部分还涉及到config.js文件,其中定义了对config.json文件读写操作的函数

2)判断config.josn的lib和www字段是否为空,非空时,按照.cordova/config_json中指定的参数下载默认的web页面部分文件(即www目录下内容),下载成功后会调用finalize函数,该函数会删除原www目录下文件,拷贝下载的文件到www目录。

3)lazy_load 函数是提供下载功能的接口文件(见src/lazy_load.js),主要包含两个函数

lazy_load.cordova

lazy_load.custom

lazy_load.js

module.exports = {
    cordova:function lazy_load(platform, callback) {
        if (!(platform in platforms)) {
            var err = new Error('Cordova library "' + platform + '" not recognized.');
            if (callback) return callback(err);
            else throw err;
        }

        var url = platforms[platform].url + ';a=snapshot;h=' + platforms[platform].version + ';sf=tgz';
        module.exports.custom(url, 'cordova', platform, platforms[platform].version, function(err) {
            if (err) {
                if (callback) return callback(err);
                else throw err;
            } else {
                if (callback) callback();
            }
        });
    },
    custom:function(url, id, platform, version, callback) {
        var download_dir = (platform == 'wp7' || platform == 'wp8' ? path.join(util.libDirectory, 'wp', id, version) :
                                                                     path.join(util.libDirectory, platform, id, version));
        if (fs.existsSync(download_dir)) {
            events.emit('log', id + ' library for "' + platform + '" already exists. No need to download. Continuing.');
            if (callback) return callback();
        }
        hooker.fire('before_library_download', {
            platform:platform,
            url:url,
            id:id,
            version:version
        }, function() {
            var uri = URL.parse(url);
            if (uri.protocol && uri.protocol[1] != ':') { // second part of conditional is for awesome windows support. fuuu windows
                npm.load(function() {
                    // Check if NPM proxy settings are set. If so, include them in the request() call.
                    var proxy;
                    if (uri.protocol == 'https:') {
                        proxy = npm.config.get('https-proxy');
                    } else if (uri.protocol == 'http:') {
                        proxy = npm.config.get('proxy');
                    }

                    shell.mkdir('-p', download_dir);
                    var size = 0;
                    var request_options = {uri:url};
                    if (proxy) {
                        request_options.proxy = proxy;
                    }
                    events.emit('log', 'Requesting ' + JSON.stringify(request_options) + '...');
                    request.get(request_options, function(err, req, body) { size = body.length; })
                    .pipe(zlib.createUnzip())
                    .pipe(tar.Extract({path:download_dir}))
                    .on('error', function(err) {
                        shell.rm('-rf', download_dir);
                        if (callback) callback(err);
                        else throw err;
                    })
                    .on('end', function() {
                        events.emit('log', 'Downloaded, unzipped and extracted ' + size + ' byte response.');
                        var entries = fs.readdirSync(download_dir);
                        var entry = path.join(download_dir, entries[0]);
                        shell.mv('-f', path.join(entry, (platform=='blackberry10'?'blackberry10':''), '*'), download_dir);
                        shell.rm('-rf', entry);
                        hooker.fire('after_library_download', {
                            platform:platform,
                            url:url,
                            id:id,
                            version:version,
                            path:download_dir,
                            size:size,
                            symlink:false
                        }, function() {
                            if (callback) callback();
                        });
                    });
                });
            } else {
                // local path
                // symlink instead of copying
                fs.symlinkSync((uri.protocol && uri.protocol[1] == ':' ? uri.href : uri.path), download_dir, 'dir');
                hooker.fire('after_library_download', {
                    platform:platform,
                    url:url,
                    id:id,
                    version:version,
                    path:download_dir,
                    symlink:true
                }, function() {
                    if (callback) callback();
                });
            }
        });
    },
    based_on_config:function(project_root, platform, callback) {
        var custom_path = config.has_custom_path(project_root, platform);
        if (custom_path) {
            var dot_file = config.read(project_root);
            module.exports.custom(dot_file.lib[platform].uri, dot_file.lib[platform].id, platform, dot_file.lib[platform].version, callback);
        } else {
            module.exports.cordova(platform, callback);
        }
    }
};

lazy_load.cordova首先查找传入的platform参数是否在顶层目录下platforms.js文件中的对象参数中是否存在;

platforms.js

module.exports = {
    'ios' : {
        parser : require('./src/metadata/ios_parser'),
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-ios.git',
        version: '3.0.0'
    }, 
    'android' : {
        parser : require('./src/metadata/android_parser'),
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git',
        version: '3.0.0'
    }, 
    'wp7' : {
        parser : require('./src/metadata/wp7_parser'),
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-wp8.git',
        version: '3.0.0'
    },
    'wp8' : {
        parser : require('./src/metadata/wp8_parser'),
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-wp8.git',
        version: '3.0.0'
    },
    blackberry10 : {
        parser : require('./src/metadata/blackberry10_parser'),
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-blackberry.git',
        version: '3.0.0'
    },
    'www':{
        url    : 'https://git-wip-us.apache.org/repos/asf?p=cordova-app-hello-world.git',
        version: '3.0.0'
    }
};

platforms.js中列出了所有cordova支持的平台,每个平台包括三个参数: 

parser : 解析平台配置参数的解析文件位置;

url : 源码存在的git路径

version:版本号

lazy_load.cordova会按照传入参数在这个表中找到对应url下载文件。

lazy_load.custom与lazy_load.cordova不同之处是,从.cordova/config_json中指定的url参数下载文件

shelljs,create函数中多次用到shelljs,它是一个可移植的类似unix shell的命令行工具,支持Windows/Linux/OS X,详见https://npmjs.org/package/shelljs



    
[3] session对象跟applicatione对象
    来源: 互联网  发布时间: 2014-02-18
session对象和applicatione对象

    ASP.NET 的常用对象有:response对象、request对象、application对象、server对象、session对象。下面主要讨论session对象和cookie对象。

session对象

    是一个会话,是一个客户与服务器之间的交互。session是HTTPSeeesionState的类别,他存储个人信息,一个用户不能访问另一个用户的session信息。一个用户说的不是一台电脑就是一个用户,而是一个浏览器,一台电脑里不同的浏览器就是不同的用户,他们的session就是不同,他们是更具sessionID的不同而区分的。session里面存放object对象类型,取出来必须使用强制转换。

    session是存放在服务器端的,他并不是一直都存在的,一定时间后他就会消亡,是根据timeOut设定的,默认的是20分钟。

session对象的应用

    如新闻发布系统当是游客的时候只能查看新闻,不能对新闻进行修改,只有有一定权限的管理员才能修改,所以只有当登陆的是管理员用户时才能进入修改页面进行修改。但是如果不进行一些限制的话,游客可以直接输入修改页面的网址直接进行修改。所以我们可以在登陆时创建一个将用户信息存放在session中,在进入修改页面的时候判断session中是否有能修改权限的用户信息,如果没有则不让他进入修改页面。

    登陆页代码如下:

if (txtUserName.text="zuo" && txtPassword.text=123456)
{
    Session["admin"] =txtUserName.text;
}

    修改页面判断如下:

if (Session["admin"]!=null && Session["admin"].ToString ()=="niunan")
            {
                 //进行相应的操作
}else
{
//返回登陆页
Response.Redirect("Login.aspx");
}

 application对象

    是应用程序类,程序启动时第一次请求时这个application实例就会运行起来。有了application对象,这个对象会维护1个或多个会话信息,多个信息共享。会话之间是隔离的,用他联系起来。他就相当于全局变量,程序已启动就存在,程序关闭时才灭亡,在他存在的过程中,多个session对象都可以访问它,所以他使用存放一些公关的信息。

    Application 对象握有会被应用程序中的许多页面使用的信息(比如数据库连接信息)。这意味着可以从任何的页面访问这些信息。同时也意味着你可在一个地点改变这些信息,然后这些改变会自动反映在所有的页面上。

application的应用

    他可以用来统计登陆某过网站的人数。在Application_Start事件中,先读取历史访问人数,然后再Session_Start事件中加1,这样每增加一个用户,就就会加1,在Application_End事件中,在将数据更新回数据库。Session_Start事件、Session_End事件、 Application_Start事件、Application_End事件都在"Global.asax",可以在 "Global.asax" 中创建 Application 变变量。

区别

    他俩都是用来存储用户信息。但是application对象只有一个,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的,一个用户一个session。所以相当于application存储的是全局变量,而session存储的是局部变量。

 

17楼dandanzmc11小时前学习啦,嘻嘻16楼ironxue12小时前要是用了思维导图,获取会更生动。15楼lishuangzhe704713小时前Session也可以存取全局变量吧??Re: zuozuo124512小时前回复lishuangzhe7047n这个全局变量的意思就是可以多个用户访问,而session只能是那一个用户访问。14楼liutengteng13013小时前继续加油啊,对比学习。13楼kanglix1an15小时前左,画个图或表格对比下,更清楚哦12楼zwk62654241715小时前知识还没有学习到,先收藏了,我这算是抢着沙发了吧。11楼leimengyuanlian昨天 21:12不错,顶一个,加油!10楼tang_huan_11昨天 21:09对比着学习,很好!加油!9楼xvshu昨天 21:07两个不同的侧面啊8楼zhuanzhe117前天 22:11有进步哦,加油7楼gxq741718618前天 15:45对比的学习,学习了!6楼lishehe前天 14:58对比学习,加油5楼han_yankun2009前天 11:19好好学习了额4楼caozhangyingfei0109前天 08:57左,有进步啊,有了区别和对比!3楼jiuqiyuliang前天 08:31加油,小左2楼cjr152336611433天前 20:43学习啦,上次头脑风暴遗留下来的1楼hanxuemin123453天前 20:40我这一部分也只是潜意识理解 学习了

    
最新技术文章:
▪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