所以我在我的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");
}
我希望使用解析框架的人能够解决这个问题。
答案 0 :(得分:2)
您不应该从Activity中的新线程调用此方法。实际上,official Parse documentation建议您不要从Activity中调用此方法。相反,您应该从parse.initialize
方法调用Application.onCreate()
,而不是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
}
}
答案 1 :(得分:1)
这是因为您在主线程中使用Networkservice
并且在android中不允许这样做,因此创建一个新线程并从中调用网络服务。有点像这样。
new Thread(new Runnable() {
@Override
public void run() {
// your logic for network service
}
}).start();
答案 2 :(得分:1)
您可以尝试在AsyncTask中坚持使用该行:
new AsyncTask<Void, Void, Void>() {
@Override
public Void doInBackground(Void... params) {
Parse.initialize();
}
}.execute();
答案 3 :(得分:1)
您可以使用AsyncTask执行此操作。在主类中编写要执行操作的AsyncTask类。如果需要,可以在异步类的预先执行中创建进度对话框,并在异步类的onpostexecute中关闭,以在AsyncClass执行解析操作时显示加载指示符。以下是您将如何做到这一点:
class MyAsync extends AsyncTask<String, Void, Void> {
ProgressDialog pd;
Context co;
MyActivity ma;
public MyAsync (MyActivity ma){
this.ma= ma;
this.co = ma;
pd= new ProgressDialog(co);
}
@Override
protected void onPreExecute() {
this.pd.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(String... params) {
Parse.initialize(this, "xxxx", "xxxxx");
return null;
}
@Override
protected void onPostExecute(Void result) {
// show results after parse and dismiss progress dialog pd.dismiss();
super.onPostExecute(result);
}
}
在MyActivity中调用:
MyActivity ma = this;
new MyAsync(ma).execute();