2015年5月17日星期日

关于LogCat时不时抽风不输出任何信息的问题的解决


LogCat时不时就抽风了,不输出(打印)任何信息,重启应用重启设备重启Eclipse都不管用,可愁死人了。如果你也遇到这样的问题,可尝试下边方法解决。

Eclipse下,
windows->show view->other->Android->Devices

这时会增加一个Deveices的控制台,你的虚拟设备或者真实设备都在里边,如图,


大多数时候LogCat无输出的原因就是跟我们的设备没有关联,所以,首先在LogCat下Clear Log,然后在Deveices下,选中你的设备摆弄摆弄就好了,如

  • 选中正在调试应用,点击控制台右上角第一个爬虫样子的按钮——Debug
  • 选中设备,右上角截屏按钮
  • ......
核心是,激活设备,关联设备。

回到LogCat,看到刷刷的信息流,是不是有点小激动呢?

2015年5月16日星期六

用Log体验Activity完整生命周期

如图为Activity生命周期示意图,虽然直观,但是不太利于记忆和理解,那就上代码吧。




代码源自《第一行代码》,在main_activity基础上,创建两活动(按钮),点击分别显示文字。
package com.example.activitylifecycletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class MainActivity extends Activity {

 public static final String TAG = "MainActivity";
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.d(TAG, "onCreat");
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  Button startNormalActivity = (Button) findViewById (R.id.start_normal_activity);
  Button startDialogActivity = (Button) findViewById (R.id.start_dialog_activity);
  startNormalActivity.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v){
    Intent intent = new Intent(MainActivity.this, NormalActivity.class);
    startActivity(intent);
   }
  });
  startDialogActivity.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v){
    Intent intent = new Intent(MainActivity.this, DialogActivity.class);
    startActivity(intent);
   }
  });
 }
 
 @Override
 protected void onStart(){
  super.onStart();
  Log.d(TAG, "onStart");
 }
 
 @Override
 protected void onResume(){
  super.onResume();
  Log.d(TAG, "onResume");
 }
 
 @Override
 protected void onPause(){
  super.onPause();
  Log.d(TAG, "onPause");
 }
 
 @Override
 protected void onStop(){
  super.onStop();
  Log.d(TAG, "onStop");
 }
 
 @Override
 protected void onDestroy(){
  super.onDestroy();
  Log.d(TAG, "onDestory");
 }
 
 @Override
 protected void onRestart(){
  super.onRestart();
  Log.d(TAG, "onRestart");
 }


}


这里引入Log来输出相应信息。注意,在Eclipse中,widows->show view->other->Android->LogCat位置打开Log控制台。这是Android调试相当有用的工具。

LogCat输出信息很多,为了方便查看,这里给LogCat加入过滤器,代码中我们命名TAG为“MainActivity”,故我们加入同名过滤器,by Log Tag为MainActivity即可。

一切就绪。运行程序,如图


LogCat中选中MainActivity过滤器可见,


当MainActivity第一次创建时,会执行onCreate(), onStart(), onResume()方法。

点击Start NormalActivity按钮,如图所示,


LogCat输出如下,

此时NormalActivity已经把MainActivity完全遮挡住,故执行onPause()和onStop()方法。

按下返回键,回到MainActivity,此时输出,



之前MainActivity活动已进入停止状态,故此时执行onRestart()方法,又依次执行onStart()和onResume()方法以重启MainActivity活动。

点击Start DialogActivity按钮,如图所示,


LogCat输出如下,



因为此时DialogActivity并没有完全覆盖MainActivity活动,MainActivity只是暂时进入了暂停状态,并没有停止,故只执行了onPause()方法。

按下返回键,回到MainActivity,此时也只有onResume()方法得到执行,如图,


试想,手机锁屏了,MainActivity会处于什么状态呢?(其实是测试时手机自动锁屏发现的)锁屏,点亮,LogCat变化如下,


很显然,当我们锁屏时,MainActivity执行onStop()方法,点亮屏幕,依次执行onRestart(), onStart(), onResume()方法。

最后,按下返回键,退出MainActivity回到桌面,LogCat输出,


同理,我们可知,当用Home建回到桌面时,会执行onPause(), onStop()方法,

再次从最近应用或点击应用回到MainActivity时,会执行onRestart(), onStart(), onRusume()方法。


这win10自带输入法老跟chrome冲突导致后者,多亏了自动保存...


2015年5月9日星期六

说说游泳

我酷爱游泳。在水里,无拘无束,自由自在,拜托地球重力,真的是彻底的放松。

最好在露天泳池,蓝天白云,好太阳,蓝水里,摆摆腿,扭扭腰,随意一划动,就能蹿出好远,除了飞行,还有比游泳更惬意更自在的运动吗?当然,飞行只在梦里很多次幻想过,上一次梦到飞行应该是上个月,这说明我还在长个子。

跟水的接触,不说羊水了吧,有印象的还是幼儿园中班,三岁。在菊潭公园的游泳池,半米深的嬉水区,我在水里,老爸在岸边,他嫌水浅就不下来。也是哎,最深的地方才一米五,还被一群戴着金链子墨镜的人占据着,根本没人凑过去,想想那时候差不多算是黑社会吧。重点来了,我在水里跳呀,走呀,扑通,滑倒了。只记得滑倒了,整个人仰躺在了水里,透过晶亮的水能看到外边刺眼的日光。时间就在那刹那停止,停止了呼吸,没有呛水,没有扑腾,就是那么静静地,在半米深的水里躺着。一个小哥过来扶起了我,把我送到了岸边,我就跟爸爸回家去了,还记得跟他招招手说了再见。

那小哥长我三两岁,在公园里是出了名的——顽劣,五六岁的孩童敢跳进猴笼跟猴子厮打,这么多年来我认识的人无出其右者。那个时候对他的印象是,一脸跟猴子打过架后的伤疤,和孩子王特有的爽朗笑容。幼时再次听闻他是小学五年级,他被所谓的六年级流氓三剑客打架,被赶出了学校?妈的,什么狗屁三剑客,去年我又见其中一人,多年造型未变,长发,双眼皮,刁烟,一脸沧桑和不恭,在网吧玩LOL,据说,他就是那儿的一个网管。

回到我的小哥身上来,又是些许年未见未闻,但是我确定他知道我的名字,学校光荣榜上的常客少年队中队长学校广播站最有特征的声音这个演出那个主持,都是我,自然,我当初也记得他的名字。每个学校每几年都有那么几个风云人物,比如说我,也比如说他,学校老大。他当初也主动给我打过招呼,而我年幼时待人接物的一向羞涩,留给他的印象恐怕永远是笑笑笑笑。

再次看到他,是高三。高三上午课间操时间跑操,对,学衡水中学那种的。校长楼后的那个竹林路工字房前的拐角,我看到了他。翩翩少年,一袭白衣,旁边站着的应该是他的家长和学校的德育处(政教处)主任,脸颊上好大的一块擦伤,正好是颧骨那里。猜得出来,他转校来了,可能是在别的学校打架被开除了。我是班级的体育委员,喊口号期间狠狠扭头看了他几眼,激动,按捺不住。我想,朱德上井冈山找老毛,也大概是这种这种心情吧。

可是在学校就没再遇到他,也听闻了他是转校过来的,但是在哪年级哪一个班我全然不知道。高三学习的紧张和规律,也让我很快忽略了这一件事情。只记得两周后,听说,他在学校打架,被人欺负,全然是被人欺负,被开除了。妈的,还有没有公道了。虎落平阳被犬欺,小哥四五岁就敢跟猴子厮打,你们敢吗!

对了,那时是暑期补课。暑期补课末尾的一个闷热骚动的晚自习,班主任石老师进来了。一如既往地打破沉默,说了几句,“我再次强调不要翻院墙溜出学校下河洗澡,前两星期楼上那个打架被开除的那个姓什么来着的,今天上午在打磨岗水库淹死了!.....”

我没听错么?!我真没听错么!是小哥,四五岁就在游泳池救我的小哥,竟然溺水了!!这尼玛开的什么玩笑,他可是救过我的命啊!他小时候就下水,水性肯定很不错,怎么就淹死了!!我甚至都没有跟他说过几句话,哪怕正面的招呼都没有打过,我还说要哪天找到他当面告诉他当年的无意之举是救了我,我的救命恩人,怎么说不在就不在了!!

惋惜。心痛。却又无人诉说。


大学开学伊始对游泳课很是期待。西电大一游泳课是必修,这也是一直自豪西电的地方,虽然这几年因为有同学游泳课溺水学校对游泳课已经放水了很多很多。夏天到来游泳课还没开始的时候,便速速去办了游泳卡,泳裤泳镜,下水。小时候就跟着老爸看了不少游泳,跳水比赛,罗春娟,田亮,郭晶晶,我可是看着他们长大的,菲尔普斯,孙杨这些小鲜肉,倒不是很熟。所以,没吃过猪肉毕竟见过猪跑,下水,竟也能艰难地游起来,还是在两米深水区。两次划水,两次蹬腿,才往前扑腾一小段,头冒出来大呼一口气,有时候是出水大出一口气。到达岸边,某值班体育老师早已泳道尽头等我。“你,没戴泳帽。你会游吗?去那边浅水区去!”

被训了,被鄙视了,好胜心驱使我,必须学会游泳!并且在游泳课之前,现在是周一,下周二第一次游泳课。我要尽快学会游泳。接下来一周,我去了五次游泳池,看视频动图教程,回想看的游泳比赛,竟真自学会了不算太标准的自由泳,和本来就摸索出的很吃力的蛙泳。
游泳课之前已经分了组,甲组是会游,乙组熟悉水性,丙组不会游。我之前报的是乙组,老师还是羽毛球队的带队老师,我是队长,第一次上课第一次下水老师在教大家怎么漂浮起来,我已经游到了对岸。从此老师便不再管我。

去年来到巴黎,照例先找到附近泳馆,办卡。还在继续不怎么标准却又费力的泳姿,算是四种泳姿全掌握。一日电话里老妈开玩笑说,要去学游泳,省得以后儿媳妇和她都不会游泳却同时掉进水里,让我为难。突然想到了小哥,救过我命却后来自己溺水的小哥。我得重新学习游泳,规范,高效,省时省力,关键时刻能毫不拖沓救人的那种。

现在每次游泳,练习是第一位的,孙杨常规训练一日游一万多米,我不歇息游一千米能行吗?自由泳,快速高效,有力;蛙泳,省力简单。救人不仅得确保自己不被淹,想象身上有一个玩命拽着你的人该怎么游。

练累了,再放松,再享受游泳。我得学会游泳救人。

2015年5月8日星期五

输出链表倒数第二个结点

忘了BAT谁家有一道面试题是输入一个单链表,输出链表倒数第二个结点,那拓展一下就是输出倒数第k个结点

常规方法是,先求链表长度N,然后从头结点开始,不断往前,直到N-k+1即可

废话不说,上代码:
struct node
{
int data;
struct node* next;
};

struct node *getK1(struct node *list, int k)
{
int n = length(list);
if(k>n)
return NULL;
struct node *current = list;   //头指针current
int i ;
for(i=0; i<n-k; i++)         
current = current->next;
return current;
};

int length(struct node *head)
{
struct node *current = head;
int count = 0;
while(current ! =NULL)
{
cout++;
current = current->next;
}
return count;

}



后又发现一个猥琐的方法,不需求链表长度即可。设置两个指针p,q,起始均指向头结点,p先向前走k步,达到第k+1个结点,此时p与q间隔了k个结点。p,q同时往前走,当p指向表尾NULL时停止,此时q向前走了N-k步,其所达到的结点就是倒数第k个结点了。

struct node *getK(struct node *head, int k)  
{  
    struct node *p, *q;  
    p = q = head;       
    for (; k>0 && p!=NULL; k--)  
        p = p->next;   
    if (k > 0) return NULL;    
    while (p != NULL) {   
        p = p->next;  
        q = q->next;  
    }  
    return p1;  
}