毕加索:如何检查单例是否已经设置
Picasso: How to check if singleton is already set
我正在使用 Picasso
来处理我的应用程序中的图像加载。在我的 Activity
我做
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_screen);
setupPicasso();
// ...
}
private void setupPicasso()
{
Cache diskCache = new Cache(getDir(CacheConstants.DISK_CACHE_DIRECTORY, Context.MODE_PRIVATE), CacheConstants.DISK_CACHE_SIZE);
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setCache(diskCache);
Picasso picasso = new Picasso.Builder(this)
.memoryCache(new LruCache(CacheConstants.MEMORY_CACHE_SIZE))
.downloader(new OkHttpDownloader(okHttpClient))
.build();
picasso.setIndicatorsEnabled(true); // For debugging
Picasso.setSingletonInstance(picasso);
}
这在首次启动应用程序和通过按主页按钮暂停应用程序时工作正常。但是,当按下后退按钮关闭应用程序,然后重新打开应用程序时,出现以下错误:
java.lang.IllegalStateException: Singleton instance already exists.
发生这种情况是因为 Picasso
不允许重置全局单例实例。解决此问题的最佳方法是什么?是否可以检查单例是否已经设置?或者我是否需要在我的 Activity
中保留一个成员变量并检查它是否是 null
?对此的任何最佳实践表示赞赏。
在您自己的 Application
中从 onCreate
调用您的 setupPicasso()
方法
class。扩展 Application
class 并覆盖 onCreate
。然后,您需要使用完全限定的应用程序 class.
将 name
属性添加到清单的 <application>
部分
package my.package
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
setupPicasso();
}
然后在您的清单中,
<application
android:name="my.package.MyApplication"
... >
您必须像 iagreen 提到的那样扩展应用程序 class,但您还应该用 try/catch 包围 setUpPicasso 方法,这样如果抛出异常,您可以处理它并阻止您的应用程序从崩溃。
所以
package my.package
public class MyApplication extends Application {
@Override
public void onCreate()
{
super.onCreate();
try
{
setupPicasso();
}
catch ( IllegalStateException e )
{
//TODO
}
}
你也可以试试这个。
private static boolean initializedPicasso = false;
if (!initializedPicasso) {
setupPicasso();
initializedPicasso = true;
}
将 setupPicasso()
方法包围在 try-catch
中,如下所示:
try
{
setupPicasso();
}
catch (Exception e)
{
e.printStackTrace();
}
我正在使用 Picasso
来处理我的应用程序中的图像加载。在我的 Activity
我做
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_screen);
setupPicasso();
// ...
}
private void setupPicasso()
{
Cache diskCache = new Cache(getDir(CacheConstants.DISK_CACHE_DIRECTORY, Context.MODE_PRIVATE), CacheConstants.DISK_CACHE_SIZE);
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setCache(diskCache);
Picasso picasso = new Picasso.Builder(this)
.memoryCache(new LruCache(CacheConstants.MEMORY_CACHE_SIZE))
.downloader(new OkHttpDownloader(okHttpClient))
.build();
picasso.setIndicatorsEnabled(true); // For debugging
Picasso.setSingletonInstance(picasso);
}
这在首次启动应用程序和通过按主页按钮暂停应用程序时工作正常。但是,当按下后退按钮关闭应用程序,然后重新打开应用程序时,出现以下错误:
java.lang.IllegalStateException: Singleton instance already exists.
发生这种情况是因为 Picasso
不允许重置全局单例实例。解决此问题的最佳方法是什么?是否可以检查单例是否已经设置?或者我是否需要在我的 Activity
中保留一个成员变量并检查它是否是 null
?对此的任何最佳实践表示赞赏。
在您自己的 Application
中从 onCreate
调用您的 setupPicasso()
方法
class。扩展 Application
class 并覆盖 onCreate
。然后,您需要使用完全限定的应用程序 class.
name
属性添加到清单的 <application>
部分
package my.package
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
setupPicasso();
}
然后在您的清单中,
<application
android:name="my.package.MyApplication"
... >
您必须像 iagreen 提到的那样扩展应用程序 class,但您还应该用 try/catch 包围 setUpPicasso 方法,这样如果抛出异常,您可以处理它并阻止您的应用程序从崩溃。
所以
package my.package
public class MyApplication extends Application {
@Override
public void onCreate()
{
super.onCreate();
try
{
setupPicasso();
}
catch ( IllegalStateException e )
{
//TODO
}
}
你也可以试试这个。
private static boolean initializedPicasso = false;
if (!initializedPicasso) {
setupPicasso();
initializedPicasso = true;
}
将 setupPicasso()
方法包围在 try-catch
中,如下所示:
try
{
setupPicasso();
}
catch (Exception e)
{
e.printStackTrace();
}