gpt4 book ai didi

java - Activity 中的 android 异常使所有单例字段为空

转载 作者:行者123 更新时间:2023-12-02 03:22:28 25 4
gpt4 key购买 nike

我有一个 Android 应用程序,它使用多个单例对象。这些对象用于许多 Activity 。当 Activity 中引发异常时,我的单例中的不同字段将变为空,并且所有其他 Activity 也会引发异常。例如,我有一个单例类来处理我的 cookie,它有一个静态 HTTPCookie 字段,如果在任何 Activity 中发生异常,该 cookie 字段也会变为 null

我想知道为什么会发生这种情况。如何防止这种情况发生?

更新:我的一个单例的代码。

public class CookieHandler {

public interface CookieHandlerCallback {
void OnNewCookieReceived();
void OnNewCookieFailed();
}

public static HttpCookie myCookie;
private static CookieHandler singleton = new CookieHandler();
private static CookieHandlerCallback cookieHandler;
private static Context context;

public static CookieHandler getInstance() {
return singleton;
}

private CookieHandler() {
}

public HttpCookie getMyCookie() {
return myCookie;
}

public static void setupInterface(CookieHandlerCallback co) {
cookieHandler = co;
}


public static void getNewCookie() {

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
final SharedPreferences.Editor editor = prefs.edit();

Gson gson = new Gson();
String json = prefs.getString("cookie", "");
myCookie = gson.fromJson(json, HttpCookie.class);



AppidoRetroAPI apiRetro = RetrofitService.getAppidoAPI();
Call<ResponseBody> call = apiRetro.getCookie(myCookie == null ? "" : myCookie.getValue());
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.code() == 401) {

Log.d("app process", "my debug" + "requestCategories in code 401 ");
String headerCookie = response.headers().get(ApiCnst.COOKIES_HEADER);
if (headerCookie != null) {
myCookie = new HttpCookie(ApiCnst.MY_COOKIE_NAME, headerCookie);
Gson gson = new Gson();
String json = gson.toJson(myCookie);
myCookie = gson.fromJson(json, HttpCookie.class);
editor.putString("cookie", json);
editor.commit();
}

} else if (response.code() == 200) {
UserProfileInfo.getInstance().setIs_logged_in(true);
try {
JSONObject jsonObject = new JSONObject(HttpManager.JsonTOString(response.body().byteStream()));
UserProfileInfo.getInstance().setUserJson(jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
Log.d("app process", "my debug" + "requestCategories in code 200 ");

}
cookieHandler.OnNewCookieReceived();

}

@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
cookieHandler.OnNewCookieFailed();
}
});
}

public static void updateContext(Context ctx) {
context = ctx;
}

最佳答案

当您的应用程序崩溃时,整个应用程序进程将重新启动,即单例也会重置,您无法阻止单例在应用程序崩溃时变为空,但您可以在创建应用程序全局应用程序上下文时进行初始化。

创建一个类App.java

public class App extends Applications{
@Override
public void onCreate() {
super.onCreate();
initializeSingletons();
}

private void initializeSingletons(){
// Initialize Singletons.
}
}

并在 list 中注册此类

<application
android:name=".App" // Register here
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
.
.
.

这将保证在所有事情之前调用,即在广播、 Activity 、服务等之前调用,这样您就可以确保当您的应用程序崩溃并重新启动时,您的单例永远不会为空。

关于java - Activity 中的 android 异常使所有单例字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com