当前位置:  编程技术>移动开发
本页文章导读:
    ▪GitHub项目合作基本步骤        GitHub项目协作基本步骤 1、查找某个项目,然后Fork 2、打开GitHub For Windows,发现刚才Fork的项目 3、对着项目点击Clone,将之复制至本地 4、使用Eclipse等进行开发,如新增一个文件 5、在GitHu.........
    ▪ 日本人为啥不创业        日本人为什么不创业? 上周在日本的时候,随一位友人去拜访他在筑波大学留学时的老师。在行前,为了遵守日本“守时”的规矩,他只告诉我这位老师是那种“一小时挣几万”的厉害角.........
    ▪ UI线程与后盾线程交互设计5种方法       UI线程与后台线程交互设计5种方法           在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的.........

[1]GitHub项目合作基本步骤
    来源: 互联网  发布时间: 2014-02-18
GitHub项目协作基本步骤

1、查找某个项目,然后Fork

2、打开GitHub For Windows,发现刚才Fork的项目
3、对着项目点击Clone,将之复制至本地
4、使用Eclipse等进行开发,如新增一个文件
5、在GitHub中发现修改项
6、添加注释,并commit
7、同步代码至个人repo

8、在浏览器中打开项目地址,发现更改已经上传至本地repo,然后点击 pull request

9、New Pull Request---->click to create a pull request for this comparision
10、填写相关资料并提交



    
[2] 日本人为啥不创业
    来源: 互联网  发布时间: 2014-02-18
日本人为什么不创业?

上周在日本的时候,随一位友人去拜访他在筑波大学留学时的老师。在行前,为了遵守日本“守时”的规矩,他只告诉我这位老师是那种“一小时挣几万”的厉害角色,我们不能迟到。我不太喜欢这个开场。

聊完公务之后,中午一起用餐,才慢慢了解到,这位叫藤井义彦、70 多岁的前辈是一位传奇人物。他毕业于著名的日本私立大学——应庆大学(Keio University),期间作为交换生在斯坦福大学读书一年。斯坦福读完书后,在美国、欧洲、亚洲做背包客流浪了 7 个月,期间在中亚一个国家时,所借宿的家庭还希望把女儿嫁给他。目前他已经去过 65 个国家。

藤井义彦(Fujii Yoshihiko)跟中国也有颇深渊源,年轻的时候沿着丝绸之路一直走到吐鲁番,去过中国多个城市。2007 年成为西北工业大学客座教授。藤井在中国出版过两本书,《挑战!哈佛 AMP 留学》和《猎头——跳槽风云录》,前者讲述他 1990 年(48 岁)前往哈佛商学院取得 AMP(高级商务管理)学位的经历,后者描述他在日本著名化妆品公司佳丽宝(Kanebo)工作 30 年后对日本式企业管理哲学的思考。

藤井从中国回到日本后,担任筑波大学客座教授,2010 年辞去该职,专心打理他 1998 年创立的顾问公司 GRI(Global Leadership Coaching),为企业高层进行培训。

以上信息是我在午餐中采访他关于“日本人为什么不创业”的问题后,发现他的开阔视野和思考问题的高度,才进一步了解到的。当初没有想到,随友人来拜访的,竟是如此一位神奇人物。

关于日本人为什么不创业的问题,藤井义彦作了两方面的回答。

一是日本学生喜欢去大公司工作,而且进入大公司后,日本人对组织没有抵抗感,比较顺从公司意志,日本人比较信奉“灭私奉公”精神。中国人却不一样,中国学生想挣很多钱,都想当老板,要争第一。他认为中国的民族性格当中,也更有野心,更有闯劲,更愿意往外看。

藤井做过一些随机调查,发现 90% 的中国学生想创业,日本学生则完全相反,90% 的学生想进大企业。比如我这位友人,留学毕业后,在日本京瓷工作两年,就回国创办了一个语言学校,面向日语人群教授中文。我后来了解到,他创业的想法其实在留学生涯开始之前就已经想好。

二是日本缺乏小企业、创新企业成长的土壤。在日本,一个小企业或创业公司要成长起来非常困难。因为与欧美市场不一样,在日本发布一个创新产品,日本人会关心创业者的背景、公司的背景,看重公司的信誉度。要知道,一个创业公司从无到有,一开始几乎是没有任何名气和信誉度的,但日本社会却很在意这些。

由于缺乏宽容的环境,日本人创业的成功率非常低,藤井说可能 1000 个创业者里只有 1 个成功。而且日本民族精神里讲究“和”,不愿意出头冒尖,更担心出格之后被孤立——日本社会往往把创业行为看作一种出格行为。

藤井还补充到,日本企业的“年功序列”也是日本人较少独立创业的原因。所谓“年功序列”,即国内所说的“排资论辈”,一些管理职位,没有在公司熬上多年的年轻人是够不着的;另一方面,年龄较长的人,即使没有很大的功劳,公司也还会轻易解雇,工资会随着工龄的增长而增长。在渡边纯一的《失乐园》小说中,男主人公和他的朋友就经历过多次“职级降低薪水不变”的情况,降级虽然会使人受挫,但日本人较少就此离开公司或创业。

不过藤井义彦也强调日本社会也在发生改变。就宏观方面来说,日本 1995 年经济泡沫之后,人们就开始认为要有创业精神,日本政府在政策方面也予以扶持。比较巧合的是,藤井义彦辞职发生在 1995 年——工作 30 年之后;自己所创办的公司,则是在经济泡沫三年之后。从这一点来看,他本人也是身体力行。

另一个变化就是“年功序列”制度的动摇。藤井说“年功序列”制度已经在 40 岁年龄段发生变化,现在大公司里 40 岁的日本人,有职位高的,也有职位低的,“在以前不是这样的”。日本年轻人对于“年功序列”开始存在不满,为什么工龄长就拿更多的工资,慢慢开始涌现更多创业。

不过即使有政府的支持,社会环境也在变得更宽容,日本年轻人走上创业道路的仍然不多,从日本创新企业在移动互联网潮流中集体失声就可见一斑。这可能要归究于经济环境。自 1990 年代经济泡沫以来,日本经济一直在执行通货紧缩政策,日本人实际上收入基本没有增加。时代变化非常快,生活压力也大,一些年轻的日本人就希望更稳定一些,这时候去大公司是比较好的选择。这个时代与藤井年轻的时候是相反的,他说那个时候经济整体向上,人们希望变化,希望求得更好的发展,“现在是经济下滑,大家求稳定”。藤井提到日本学生为了更稳定的生活,现在出国留学的学生也在逐年减少。

藤井义彦本人一直在倡导日本年轻人增强自己的主体意识,不应该是“灭私奉公”,而应“活私奉公”。他认为企业有自己的价值观,个体也有自己的价值观,一个人在公司工作必须要有个人理想,要有自己的主体性。不过他不认为日本人应该颠覆传统的“和”的团体意识,而是在现有民族意识上加上“主体性”意识。

这是一项长期的工程和使命,藤井会在多个场合演讲他的“活私奉公”倡议。不过他认为改变的关键还是在于日本人自己,“日本人总喜欢找借口,说 ‘失败不可原谅’‘社会环境不宽容’,不敢创业”,藤井说,“但年轻人要有创业的勇气,不要怕失败。日本人有更多自己的主体性,日本社会就会变得更好”。


    
[3] UI线程与后盾线程交互设计5种方法
    来源: 互联网  发布时间: 2014-02-18
UI线程与后台线程交互设计5种方法
     

     在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。

        一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。
       在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一 个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行, 以免阻塞主线程。


        那么,UI Thread如何和其他Thread一起工作呢?常用方法是:

        诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。


 

我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。

在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控。为了解决这个问题,于是就引出了我们今天的话题。Android中后台线程如何与UI线程交互。

据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。

1、handler

2、Activity.runOnUIThread(Runnable)

3、View.Post(Runnable)

4、View.PostDelayed(Runnabe,long)

5、AsyncTask

方法一:handler

handler是android中专门用来在线程之间传递信息类的工具。

要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。

为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message。

这里说的looper可不是前段时间的好莱坞大片环形使者,他的主要功能是为特定单一线程运行一个消息环。一个线程对应一个looper。同样一个looper对应一个线程。这就是所谓的特定单一。一般情况下,在一个线程创建时他本身是不会生产他特定单一的looper的(主线程是个特例)。因此我们需要手动的把一个looper与线程相关联。其方法只需在需要关联的looper的线程中调用Looper.prepare。之后我们再调用Looper.loop启动looper。

说了这么多looper的事情,到底这个looper有什么用哪。其实之前我们已经说到了,他是为线程运行一个消息环。具体的说,在我们将特定单一looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。然后线程就会根据message中的内容进行相应的操作。

那么messageQueue中的message是从哪里来的哪?那就要提到handler了。在我们创建handler的时候,我们需要与特定的looper绑定。这样通过handler我们就可以把message传递给特定的looper,继而传递给特定的线程。在这里,looper和handler并非一一对应的。一个looper可以对应多个handler,而一个handler只能对应一个looper(突然想起了一夫多妻制,呵呵)。这里补充一下,handler和looper的绑定,是在构建handler的时候实现的,具体查询handler的构造函数。

在我们创建handler并与相应looper绑定之后,我们就可以传递message了。我们只需要调用handler的sendMessage函数,将message作为参数传递给相应线程。之后这个message就会被塞进looper的messageQueue。然后再被looper取出来交给线程处理。

这里要补充说一下message,虽然我们可以自己创建一个新的message,但是更加推荐的是调用handler的obtainMessage方法来获取一个message。这个方法的作用是从系统的消息池中取出一个message,这样就可以避免message创建和销毁带来的资源浪费了(这也就是算得上重复利用的绿色之举了吧)。

突然发现有一点很重要的地方没有讲到,那就是线程从looper收到message之后他是如何做出响应的嘞。其实原来线程所需要做出何种响应需要我们在我们自定义的handler类中的handleMessage重构方法中编写。之后才是之前说的创建handler并绑定looper。

好吧说的可能哟点乱,总结一下利用handler传递信息的方法。

假设A线程要传递信息给B线程,我们需要做的就是

1、在B线程中调用Looper.prepare和Looper.loop。(主线程不需要)

2、 编写Handler类,重写其中的handleMessage方法。

3、创建Handler类的实例,并绑定looper

4、调用handler的sentMessage方法发送消息。

到这里,我们想handler的运行机制我应该是阐述的差不多了吧,最后再附上一段代码,供大家参考。

 1 public class MyHandlerActivity extends Activity {
 2      TextView textView;
 3      MyHandler myHandler;
 4  
 5      protected void onCreate(Bundle savedInstanceState) {
 6          super.onCreate(savedInstanceState);
 7          setContentView(R.layout.handlertest);
 8  
 9          //实现创建handler并与looper绑定。这里没有涉及looper与
            //线程的关联是因为主线程在创建之初就已有looper
10          myHandler=MyHandler(MyHandlerActivitythis.getMainLooper());
11          textView = (textView) findViewById(R.id.textView);
12         
13          MyThread m = new MyThread();
14          new Thread(m).start();
15      }
16  
17  
18      class MyHandler extends Handler {
19          public MyHandler() {
20          }
21  
22          public MyHandler(Looper L) {
23              super(L);
24          }
25  
26          // 必须重写这个方法,用于处理message
27          @Override
28          public void handleMessage(Message msg) {
29              // 这里用于更新UI
30              Bundle b = msg.getData();
31              String color = b.getString("color");
32              MyHandlerActivity.this.textView.setText(color);
33          }
34      }
35  
36      class MyThread implements Runnable {
37          public void run() {
38              //从消息池中取出一个message
39              Message msg = myHandler.obtainMessage();
40              //Bundle是message中的数据
41              Bundle b = new Bundle();
42              b.putString("color", "我的");
43              msg.setData(b);
44              //传递数据
45              myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
46          }
47      }

方法二:Activity.runOnUIThread(Runnable)

 这个方法相当简单,我们要做的只是以下几步

1、编写后台线程,这回你可以直接调用UI控件

2、创建后台线程的实例

3、调用UI线程对应的Activity的runOnUIThread方法,将后台线程实例作为参数传入其中。

注意:无需调用后台线程的start方法

方法三:View.Post(Runnable)

 该方法和方法二基本相同,只是在后台线程中能操控的UI控件被限制了,只能是指定的UI控件View。方法如下

1、编写后台线程,这回你可以直接调用UI控件,但是该UI控件只能是View

2、创建后台线程的实例

3、调用UI控件View的post方法,将后台线程实例作为参数传入其中。

方法四:View.PostDelayed(Runnabe,long)

该方法是方法三的补充,long参数用于制定多少时间后运行后台进程 

方法五:AsyncTask

AsyncTask是一个专门用来处理后台进程与UI线程的工具。通过AsyncTask,我们可以非常方便的进行后台线程和UI线程之间的交流。

那么AsyncTask是如何工作的哪。

AsyncTask拥有3个重要参数

1、Params 

2、Progress

3、Result

Params是后台线程所需的参数。在后台线程进行作业的时候,他需要外界为其提供必要的参数,就好像是一个用于下载图片的后台进程,他需要的参数就是图片的下载地址。

Progress是后台线程处理作业的进度。依旧上面的例子说,就是下载图片这个任务完成了多少,是20%还是60%。这个数字是由Progress提供。

Result是后台线程运行的结果,也就是需要提交给UI线程的信息。按照上面的例子来说,就是下载完成的图片。

AsyncTask还拥有4个重要的回调方法。

1、onPreExecute

2、doInBackground

3、onProgressUpdate

4、onPostExecute

onPreExecute运行在UI线程,主要目的是为后台线程的运行做准备。当他运行完成后,他会调用doInBackground方法。

doInBackground运行在后台线程,他用来负责运行任务。他拥有参数Params,并且返回Result。在后台线程的运行当中,为了能够更新作业完成的进度,需要在doInbackground方法中调用PublishProgress方法。该方法拥有参数Progress。通过该方法可以更新Progress的数据。然后当调用完PublishProgress方法,他会调用onProgressUpdate方法用于更新进度。

onProgressUpdate运行在UI线程,主要目的是用来更新UI线程中显示进度的UI控件。他拥有Progress参数。在doInBackground中调用PublishProgress之后,就会自动调onProgressUpdate方法

onPostExecute运行在UI线程,当doInBackground方法运行完后,他会调用onPostExecute方法,并传入Result。在onPostExecute方法中,就可以将Result更新到UI控件上。

明白了上面的3个参数和4个方法,你要做的就是

1、编写一个继承AsyncTask的类,并声明3个参数的类型,编写4个回调方法的内容。

2、然后在UI线程中创建该类(必须在UI线程中创建)。

3、最后调用AsyncTask的execute方法,传入Parmas参数(同样必须在UI线程中调用)。

这样就大功告成了。

另外值得注意的2点就是,千万不要直接调用那四个回调方法。还有就是一个AsyncTask实例只能执行一次,否则就出错哦。

以上是AsyncTask的基本用法,更加详细的内容请参考android官方文档。最后附上一段代码,供大家参考。

 1 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 
 2 //在这里声明了Params、Progress、Result参数的类型
 3 {
 4     //因为这里不需要使用onPreExecute回调方法,所以就没有加入该方法
 5     
 6     //后台线程的目的是更具URL下载数据
 7      protected Long doInBackground(URL... urls) {
 8          int count = urls.length;//urls是数组,不止一个下载链接
 9          long totalSize = 0;//下载的数据
10          for (int i = 0; i < count; i++) {
11              //Download是用于下载的一个类,和AsyncTask无关,大家可以忽略他的实现
12              totalSize += Downloader.downloadFile(urls[i]);
13              publishProgress((int) ((i / (float) count) * 100));//更新下载的进度
14              // Escape early if cancel() is called
15              if (isCancelled()) break;
16          }
17          return totalSize;
18      }
19 
20      //更新下载进度
21      protected void onProgressUpdate(Integer... progress) {
22          setProgressPercent(progress[0]);
23      }
24 
25      //将下载的数据更新到UI线程
26      protected void onPostExecute(Long result) {
27          showDialog("Downloaded " + result + " bytes");
28      }
29  }
30  

 有了上面的这个类,接下你要做的就是在UI线程中创建实例,并调用execute方法,传入URl参数就可以了。

这上面的5种方法各有优点。但是究其根本,其实后面四种方法都是基于handler方法的包装。在一般的情形下后面四种似乎更值得推荐。但是当情形比较复杂,还是推荐使用handler。


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