8.1.1. YambaApplication类
8.1.1.YambaApplication类
首先要做的是创建新类文件,这个类名为YambaApplication,它继承了框架中Application作为其基类。
接下来需要把一些通用的代码移动到这个类中。通用的代码指那些可以被程序各部分所重用的代码,比如连接到服务端或者读取配置数据。
留意Application对象里面除了常见的onCreate(),还提供了一个onTerminate()接口,用于在程序退出时的进行一些清理工作。虽然在这里我们没有什么需要清理,但是借机记录一些log信息也不错,方便观察程序在何时退出。在后面,我们可能会回到这里,。
例 8.1. YambaApplication.java
package com.marakana.yamba3;
import winterwell.jtwitter.Twitter;
import android.app.Application;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
public class YambaApplication1 extends Application implements
OnSharedPreferenceChangeListener { //
private static final String TAG = YambaApplication1.class.getSimpleName();
public Twitter twitter; //
private SharedPreferences prefs;
@Override
public void onCreate() { //
super.onCreate();
this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
this.prefs.registerOnSharedPreferenceChangeListener(this);
Log.i(TAG, "onCreated");
}
@Override
public void onTerminate() { //
super.onTerminate();
Log.i(TAG, "onTerminated");
}
public synchronized Twitter getTwitter() { //
if (this.twitter == null) {
String username = this.prefs.getString("username", "");
String password = this.prefs.getString("password", "");
String apiRoot = prefs.getString("apiRoot",
"http://yamba.marakana.com/api");
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)
&& !TextUtils.isEmpty(apiRoot)) {
this.twitter = new Twitter(username, password);
this.twitter.setAPIRootUrl(apiRoot);
}
}
return this.twitter;
}
public synchronized void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) { //
this.twitter = null;
}
}
- YambaApplication只有作为Application的子类才可以作为一个合法的Application 对象。另外你可能发现了我们在将OnSharedPreferenceChangeListener的实现从StatusActivity移动到了这里。
- Twitter和SharedPreferences在这里都成为了共享对象的一部分,而不再为StatusActivity所私有。
- onCreate()在 Application 对象第一次创建的时候调用。只要应用的任何一个部分启动(比如 Activity 或者 Service ), Application 对象都会随之创建。
- onTerminate()调用于应用结束之前,在里面可以做些清理工作。在这里我们只用来记录log。
- 我们也把StatusActivity的getTwitter()方法移动到这里,因为它会为程序的其它部分所调用,这一来有利于提高代码的重用。留意下这里的synchronized关键字, Java 中的synchronized方法表示此方法在同一时刻只能由一个线程执行。这很重要,因为我们的应用会在不同的线程里用到这个函数。
- onSharedPreferenceChanged()也从StatusActivity移动到了YambaApplication。
现在我们已经有了YambaApplication类,也转移了StatusActivity的一部分功能过来。接下来可以进一步简化StatusActivity:
例 8.2. StatusActivity using YambaApplication
...
Twitter.Status status = ((YambaApplication) getApplication())
.getTwitter().updateStatus(statuses[0]); //
...
- 现在是使用来自YambaApplication的getTwitter()方法,而不再是局部调用。类似的,其它需要访问服务端的代码也都需要使用这个方法。