参考《疯狂android讲义》第2.5节P94
1、创建一个或者多个ListView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".MainActivity" > <ListView android:id="@+id/list1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#f00" android:dividerHeight="2dp" android:headerDividersEnabled="false" /> <ListView android:id="@+id/list2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#0f0" android:dividerHeight="2dp" android:headerDividersEnabled="true" /> </LinearLayout>
2、创建TextViewResource,为每个元素定义其显示属性
array_item1.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_item1" android:layout_width="match_parent" android:layout_height="match_parent" android:textSize="20sp" android:padding="10dp" android:shadowColor="#0f0" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2"> </TextView>array_item2.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_item2" android:layout_width="match_parent" android:layout_height="match_parent" android:textSize="20sp" android:padding="10dp" android:shadowColor="#ff0" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2"> </TextView>
3、创建Activity,并完成以下三个步骤
package com.ljh.listviewdemo; import android.os.Bundle; import android.app.Activity; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //3、定义每个元素的内容 String[] arr1 = new String[]{"孙悟空","猪八戒","沙僧","唐僧"}; //4、将元素属性及元素内容包装为ArrayAdapter ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, R.layout.array_item1, arr1); //5、为ListView设置Adapter ListView list1 = (ListView) findViewById(R.id.list1); list1.setAdapter(adapter1); //3、定义每个元素的内容 String[] arr2 = new String[]{"Java","C++","Python","PHP"}; //4、将元素属性及元素内容包装为ArrayAdapter ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, R.layout.array_item2, arr2); //5、为ListView设置Adapter ListView list2= (ListView) findViewById(R.id.list2); list2.setAdapter(adapter2); } }
作者:Younger Liu,
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
在分析Linu内核启动的过程中,发现一段“不平常”的日志,感觉产生这段日志的代码肯定是“不可思议”的。因此就大致分析了一下:
日志如下:
[ 0.000000] console [ttyMT0] enabled
[ 2.157770] Calibrating delay loop... 1694.10 BogoMIPS (lpj=4235264)
更精细的日志如下:
[ 0.000000] start:sched_clock_init.
[ 2.100505] end :sched_clock_init.
与这段日志有关的代码是:
void sched_clock_init(void)
{
/*printk(KERN_CRIT “start:sched_clock_init.\n”)*/
sched_clock_running = 1;
/*printk(KERN_CRIT “end :sched_clock_init.\n”)*/
}
难道这一句简简单单的赋值就会花费两秒是的时间??那么就分析一下相关的代码:sched_clock_running作用和printk的实现。
1. sched_clock_running的作用
分析发现,调用sched_clock_running的地方仅仅有函数sched_clock_cpu():
u64 sched_clock_cpu(int cpu)
{
if (unlikely(!sched_clock_running))
return 0;
return sched_clock();
}
很明显,如果sched_clock_running为0(unlikely已经说明sched_clock_running很少为0),则返回0;如果不为0,调用sched_clock返回当前的调度时钟时间(相对系统起始的时间,单位为纳秒)。
函数sched_clock_cpu()被大约四个函数调用cpu_clock() / local_clock / update_rq_clock() / ttwu_queue()。
综上可知,执行sched_clock_init之前,获取的调度时钟时间都是0,执行sched_clock_init之后,取得的调度时钟时间都是有非零值的。
2. Printk()的实现
Printk的实现都在文件./kernel/printk.c中。Printk() -> vprintk(),而在vprintk()会通过cpu_clock()获取时间。而有上可知,能否打印时间是和sched_clock_init有没有被执行是有直接关系的。
3. 结论
通过分析,可以知道,日志中显示的两秒的差距不是因为执行语句花费了两秒,而是因为在该语句之前,没有获取到有效的调度时钟时间。
作者:Younger Liu,
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
今天试了一下,比较常用的退出app方式,快速连击返回键,退出应用程序,不多说,上代码:
// 退出时间 private long currentBackPressedTime = 0; // 退出间隔 private static final int BACK_PRESSED_INTERVAL = 2000; //在activity中重写onBackPressed方法 @Override public void onBackPressed() { // 判断时间间隔 if (System.currentTimeMillis() - currentBackPressedTime > BACK_PRESSED_INTERVAL) { currentBackPressedTime = System.currentTimeMillis(); Toast.makeText(this, "再按一次返回键退出程序", Toast.LENGTH_SHORT).show(); } else { // 退出 SysApplication.Quit(this); } }
另一种方法是:重写onKeyDown方法,里面写一个popupwindow展示
@Override public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) { switch (paramInt) { case 4: PopupUtil.showOutPop(this, this.homePageMainLayout); default: return false; } }