8.1.1. YambaApplication类

优质
小牛编辑
123浏览
2023-12-01

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;

}

}

  1. YambaApplication只有作为Application的子类才可以作为一个合法的Application 对象。另外你可能发现了我们在将OnSharedPreferenceChangeListener的实现从StatusActivity移动到了这里。
  2. Twitter和SharedPreferences在这里都成为了共享对象的一部分,而不再为StatusActivity所私有。
  3. onCreate()在 Application 对象第一次创建的时候调用。只要应用的任何一个部分启动(比如 Activity 或者 Service ), Application 对象都会随之创建。
  4. onTerminate()调用于应用结束之前,在里面可以做些清理工作。在这里我们只用来记录log。
  5. 我们也把StatusActivity的getTwitter()方法移动到这里,因为它会为程序的其它部分所调用,这一来有利于提高代码的重用。留意下这里的synchronized关键字, Java 中的synchronized方法表示此方法在同一时刻只能由一个线程执行。这很重要,因为我们的应用会在不同的线程里用到这个函数。
  6. onSharedPreferenceChanged()也从StatusActivity移动到了YambaApplication。

现在我们已经有了YambaApplication类,也转移了StatusActivity的一部分功能过来。接下来可以进一步简化StatusActivity:

例 8.2. StatusActivity using YambaApplication

...

Twitter.Status status = ((YambaApplication) getApplication())

.getTwitter().updateStatus(statuses[0]); //

...

  1. 现在是使用来自YambaApplication的getTwitter()方法,而不再是局部调用。类似的,其它需要访问服务端的代码也都需要使用这个方法。