我正在使用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
?对此有任何最佳做法表示赞赏。
答案 0 :(得分:3)
在您自己setupPicasso()
的{{1}}中呼叫onCreate
方法
类。扩展Application
类并覆盖Application
。然后,您需要使用完全限定的应用程序类将onCreate
属性添加到清单的name
部分。
<application>
然后在你的清单中,
package my.package
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
setupPicasso();
}
答案 1 :(得分:1)
你必须像iagreen所提到的那样扩展应用程序类,但你也应该使用try / catch包围setUpPicasso方法,这样如果抛出异常,你就可以处理它并防止你的应用程序崩溃。
所以
package my.package
public class MyApplication extends Application {
@Override
public void onCreate()
{
super.onCreate();
try
{
setupPicasso();
}
catch ( IllegalStateException e )
{
//TODO
}
}
答案 2 :(得分:0)
您也可以试试这个。
private static boolean initializedPicasso = false;
if (!initializedPicasso) {
setupPicasso();
initializedPicasso = true;
}
答案 3 :(得分:0)
在setupPicasso()
中围绕try-catch
方法,如下所示:
try {
setupPicasso();
} catch (Exception e) {
e.printStackTrace();
}