在Android中使用java singleton类进行常见任务

时间:2015-09-09 03:08:23

标签: java android

在我的Android应用程序中,有一些常见的任务,例如获取服务器的IP以进行API调用 - 为此我创建了一个单例类

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类并实例化该类以调用活动中的方法。

哪种方法更有效,更强大?

任何专家评论都将受到高度赞赏。提前致谢

2 个答案:

答案 0 :(得分:1)

Singleton是一种模式,你无法测试它是否真的是单身。因为我看到你的单身人士也不是线程安全的。 You can refer here

如果您希望IP地址安全,请不要将其放在资产目录中。任何人都可以通过将您的.apk更改为.zip来查看。 我认为你应该创建一个类并创建一个静态的最终String,如:

public class Constants {
    public static final String MY_IP = "your file content";
}

我认为你只是阅读一个文本文件,几乎没有一行文字。

并像访问IP一样。

String ip = Constants.MY_IP;

答案 1 :(得分:0)

我只使用单身,以防它需要维持一些全局状态。例如,可以从数据库写入和获取数据的DAO只需要一个数据库连接对象,尽管在这种情况下我可以在每次需要时调用Database.getConnection(),但是通过在类中使用保存连接的单个对象,它会加快一点,也更容易调试。否则,静态方法是好的。