所以我在我的 Android 应用程序中使用解析框架,除了一件小事情之外,一切都运行良好。当我将应用程序插入后台并在一段时间后恢复它时。我正在得到
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
at com.android.org.conscrypt.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:1009)
at org.apache.http.impl.SocketHttpClientConnection.close(SocketHttpClientConnection.java:205)
at org.apache.http.impl.conn.DefaultClientConnection.close(DefaultClientConnection.java:161)
at org.apache.http.impl.conn.tsccm.AbstractConnPool.closeConnection(AbstractConnPool.java:320)
at org.apache.http.impl.conn.tsccm.AbstractConnPool.shutdown(AbstractConnPool.java:296)
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.shutdown(ConnPoolByRoute.java:670)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.shutdown(ThreadSafeClientConnManager.java:256)
at com.parse.ParseRequest.initialize(ParseRequest.java:104)
at com.parse.Parse.initialize(Parse.java:108)
我不知道如何防止这种情况,并且只有当应用程序在后台运行很长时间后返回时才会发生这种情况。
我从某处听说,这种行为只发生在 KitKat 上,但这绝不是一种保证。我已经考虑过在单独的线程中执行初始化,但我无法让它工作(我对此很陌生)
我通过在我的 Activity 中执行此代码来初始化解析:
@Override
public void onCreate()
{
super.onCreate();
Parse.initialize(this, "xxxx", "xxxxx");
}
我希望使用解析框架的人能够解决这个问题。
最佳答案
您不应该从 Activity 中的新线程调用此方法。事实上,official Parse documentation建议您根本不要从 Activity 中调用此方法。相反,您应该从 Application.onCreate()
方法调用 parse.initialize
,而不是 Activity.onCreate() 方法。我不认为从 Activity.onCreate()
调用它有什么大不了的,但显然确实如此,尤其是在 KitKat 中。不过,这实现起来相当简单。创建一个扩展 android.app.Application
的新 java 类文件。该文件的名称应与您的项目完全相同(区分大小写)。像这样的东西:
package com.your_package.your_project_name;
import com.parse.Parse;
import android.app.Application;
public class your_project_name extends Application {
@Override
public void onCreate(){
super.onCreate();
Parse.initialize(this, "your application id", "your client key");
//if you need to, initialize ParseFacebookUtils, etc. here
}
}
关于java - App 从解析初始化恢复返回后,在主线程上获取网络异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23358486/