【问题标题】:Using java singleton class in Android for common tasks在 Android 中使用 java 单例类执行常见任务
【发布时间】:2015-09-09 03:08:22
【问题描述】:

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

哪种方法更高效、更稳健?

任何专业的 cmets 都将受到高度赞赏。提前致谢

【问题讨论】:

  • 没有必要扩展活动类,让你的方法静态就是这样。

标签: java android


【解决方案1】:

单例模式是一种您无法测试它是否真的是单例模式的模式。我看到你的单例也不是线程安全的。 You can refer here.

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

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

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

并像访问IP一样。

String ip = Constants.MY_IP;

【讨论】:

    【解决方案2】:

    我建议你使用像这样的静态方法:

    public static String getServerIp(Context ct) {
      ....
    }
    

    还有一个问题要问你Why use a singleton instead of static methods?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2022-06-13
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 2014-03-28
        • 2015-03-20
        相关资源
        最近更新 更多