在Parse初始化后从App恢复返回后获取主线程异常的网络

时间:2014-04-29 07:38:57

标签: java android parse-platform

所以我在我的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"); 
  }

我希望使用解析框架的人能够解决这个问题。

4 个答案:

答案 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();