標籤:筆試題
一、android幾種定時器的機制及區別。
答:在android中,經常用到的定時器主要有以下幾種實現:
1、採用handler與線程的sleep(long)方法
開啟一個線程,,每隔1s向Handler發送訊息
public class MainActivity extends Activity {private Handler myhandler;private static int timemessage=0x01;private int timer=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif(msg.what==timemessage){System.out.println("timer="+(++timer));}}};new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {System.out.println("執行了");Thread.sleep(2000);myhandler.sendEmptyMessage(timemessage);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}}
2、採用Handler內建的postDelayed(Runnable,long)方法
利用延遲幾秒發送Message,嵌套postDelayed()實現定時器。
public class MainActivity extends Activity {private Handler myhandler;private static int timemessage = 0x01;private int timer = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif (msg.what == timemessage) {System.out.println("timer=" + (++timer));}}};myhandler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmyhandler.sendEmptyMessage(timemessage);myhandler.postDelayed(this, 1000);if (timer == 10) {myhandler.removeMessages(timemessage);}}}, 1000);}}3、採用Handler與Timer、TimerTask結合的方法
利用Timer類的schedule()方法,每隔一段時間做什麼事情實現定時器。
public class MainActivity extends Activity {private Handler myhandler;private static int timemessage = 0x01;private int timer = 0;private Timer timerobject;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif (msg.what == timemessage) {System.out.println("timer=" + (++timer));}}};timerobject=new Timer();timerobject.schedule(new TimerTask() {//1s後,在每隔1s做什麼事情@Overridepublic void run() {// TODO Auto-generated method stubmyhandler.sendEmptyMessage(timemessage);}}, 1000,1000);}}
二、利用Listview顯示姓名和年齡,採用SimpleAdapter實現。
public class MainActivity extends Activity {private ListView mylistview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mylistview = (ListView) findViewById(R.id.listviewid);List<Map<String, Object>> listdata = new ArrayList<Map<String, Object>>();//每行顯示是一個Map對象for (int i = 0; i < 10; i++) {Map mapdata = new HashMap<String, Object>();mapdata.put("name", "limi");mapdata.put("age", "30");listdata.add(mapdata);}//第二個參數是ListView行布局//第三個參數為存放Map元素的key值//第四個參數將key值對應的元素在布局哪裡顯示SimpleAdapter myadpter = new SimpleAdapter(getApplicationContext(),listdata, R.layout.listviewdatalayout, new String[] { "name","age" }, new int[] { R.id.name, R.id.age });mylistview.setAdapter(myadpter);}}
三、Android單例模式應用及優點
單例模式確保某一個類只有一個執行個體。通過使用private的建構函式確保在應用中只產生一個執行個體。
由於單例模式在記憶體中只有一個執行個體,減少了記憶體開銷。
單例模式可以避免對資源的多重佔用,例如一個寫檔案時,由於只有一個執行個體存在記憶體中,避免了對同一個資源的同時寫操作。
使用單例模式,解決的就是多線程的同時建立的問題。
public class Person{private Person(){};private static Person zongtong;public static Person getPersonStance(){if(zongtong==null){synchronized(Person.class){if(zongtong==null){zongtong=new Person();}}}return zongtong;}}