在Android中使用java singleton类执行常见任务
在我的android应用程序中,有一些常见的任务,例如获取服务器的IP以进行API调用——为此,我创建了一个singleton类在Android中使用java singleton类执行常见任务,java,android,Java,Android,在我的android应用程序中,有一些常见的任务,例如获取服务器的IP以进行API调用——为此,我创建了一个singleton类 public class MiscFunctions extends Activity { private static MiscFunctions ourInstance = new MiscFunctions(); public static MiscFunctions getInstance() { return ourInstance; } pr
public class MiscFunctions extends Activity {
private static MiscFunctions ourInstance = new MiscFunctions();
public static MiscFunctions getInstance() {
return ourInstance;
}
private MiscFunctions() {
}
/*
method to return the ip of main server.
The ip is written in plain text in file server_url.txt in assets folder
*/
public String getServerIP(Context c) {
try {
AssetManager am = c.getAssets();
InputStream is = am.open("server_url.txt");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
return new String(buffer);
}
catch (IOException e) {
System.out.println("IO Error while accesssing server_url.txt");
e.printStackTrace();
return "Failed to open server_url.txt";
}
catch (NullPointerException e) {
System.out.println("NullPointer exception error while accessrng server_url.txt");
e.printStackTrace();
return "Failed to open server_url.txt";
}
catch (Exception e) {
System.out.println("Unknown exception error while accessrng server_url.txt");
e.printStackTrace();
return "Failed to open server_url.txt";
}
}
}
然后我将在各种活动中使用本课程,如:
Context c = this.getApplicationContext();
server_ip = MiscFunctions.getInstance().getServerIP(c);
我只是想知道这是不是正确的方法?或者我应该使用一个常规java类并实例化该类以调用活动中的方法
哪种方法更有效、更稳健
如有任何专家意见,将不胜感激。提前感谢我建议您使用静态方法,如:
public static String getServerIp(Context ct) {
....
}
这里还有另一个问题我只在需要维护一些全局状态的情况下使用单例。例如,一个可以从数据库中写入和获取数据的DAO只需要一个数据库连接对象,尽管在本例中,我可以在每次需要时调用
database.getConnection()
,但通过在保存连接的类中使用单个对象,它将加快一点速度,并且更易于调试。否则,静态方法是好的 单例是一种模式,你无法测试它是否真的是单例。正如我所看到的,您的单例也不是线程安全的。
如果你希望你的IP地址是安全的,那么不要把它放在你的资产目录中。任何人都可以通过将.apk
更改为.zip
来查看它。
我认为您应该创建一个类并创建一个静态的最终字符串,如:
public class Constants {
public static final String MY_IP = "your file content";
}
我认为你只是在读一个文本文件,而不是一行文本
和访问IP一样
String ip = Constants.MY_IP;
没有必要扩展activity类并使您的方法成为静态的,就是这样。