【问题标题】:Android - Parse.com - ParseRequestException: bad protocolAndroid - Parse.com - ParseRequestException:协议错误
【发布时间】:2015-11-12 18:25:15
【问题描述】:

我在我的应用程序中使用 parse 作为我的后端,我遇到了一个奇怪的异常,我无法弄清楚为什么,我不确定这是我的问题还是 parses 的问题,所以我想问一下在这里也许有人可以帮助我。

我发现了一个类似的帖子 "here" 但它没有答案,我的问题非常相似,因为我的查询有时也需要很长时间(一旦花了保存查询需要 5 小时),有时我会遇到此异常:

    com.parse.ParseRequest$ParseRequestException: bad protocol
at com.parse.ParseRequest.java.util.concurrent.ThreadPoolExecutor newThreadPoolExecutor(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.ThreadFactory)(Unknown Source)
                       void initialize(android.content.Context)
                       bolts.Task onPreExecute(bolts.Task)
                       com.parse.ParseHttpBody newBody(com.parse.ProgressCallback)
                       com.parse.ParseHttpRequest newRequest(com.parse.ParseRequest$Method,com.parse.ProgressCallback)
                       bolts.Task onResponse(com.parse.ParseHttpResponse,com.parse.ProgressCallback)
                       bolts.Task executeAsync(com.parse.ProgressCallback,com.parse.ProgressCallback)
                       bolts.Task executeAsync(int,long,com.parse.ProgressCallback)
                       com.parse.ParseException newPermanentException(int,java.lang.String)
                       com.parse.ParseException newTemporaryException(java.lang.String,java.lang.Throwable)
                       com.parse.ParseHttpRequest access$000(com.parse.ParseRequest)
                       com.parse.ParseHttpRequest access$002(com.parse.ParseRequest,com.parse.ParseHttpRequest)
                       bolts.Task access$300(com.parse.ParseRequest,int,long,com.parse.ProgressCallback)
at com.parse.ParseRequest$2.bolts.Task then(bolts.Task)(Unknown Source)
at com.parse.ParseRequest$2.java.lang.Object then(bolts.Task)(Unknown Source)
at bolts.Task$14.void run()(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
 Caused by: org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:589)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:511)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:489)
at com.parse.ParseApacheHttpClient.com.parse.ParseHttpResponse execute(com.parse.ParseHttpRequest)(Unknown Source)
                                com.parse.ParseHttpResponse getResponse(org.apache.http.HttpResponse)
                                void setParseRequestCancelRunnable(com.parse.ParseHttpRequest,org.apache.http.client.methods.HttpUriRequest)
at com.parse.ParseRequest$3.bolts.Task then(bolts.Task)(Unknown Source)
at com.parse.ParseRequest$3.java.lang.Object then(bolts.Task)(Unknown Source)
at bolts.Task$14.void run()(Unknown Source)
at bolts.BoltsExecutors$ImmediateExecutor.void execute(java.lang.Runnable)(Unknown Source)
at bolts.Task.boolean isFaulted()(Unknown Source)
           bolts.Task onSuccessTask(bolts.Continuation,java.util.concurrent.Executor)
           bolts.Task onSuccessTask(bolts.Continuation,java.util.concurrent.Executor,bolts.CancellationToken)
           bolts.Task onSuccessTask(bolts.Continuation)
           void completeAfterTask(bolts.Task$TaskCompletionSource,bolts.Continuation,bolts.Task,java.util.concurrent.Executor,bolts.CancellationToken)
at bolts.Task.boolean isCompleted()(Unknown Source)
           bolts.Task continueWithTask(bolts.Continuation,java.util.concurrent.Executor)
           bolts.Task continueWithTask(bolts.Continuation,java.util.concurrent.Executor,bolts.CancellationToken)
           bolts.Task continueWithTask(bolts.Continuation)
           void access$200(bolts.Task$TaskCompletionSource,bolts.Continuation,bolts.Task,java.util.concurrent.Executor,bolts.CancellationToken)
           boolean access$400(bolts.Task)
           boolean access$502(bolts.Task,boolean)
at bolts.Task.boolean isCompleted()(Unknown Source)
           bolts.Task continueWithTask(bolts.Continuation,java.util.concurrent.Executor)
           bolts.Task continueWithTask(bolts.Continuation,java.util.concurrent.Executor,bolts.CancellationToken)
           bolts.Task continueWithTask(bolts.Continuation)
           void access$200(bolts.Task$TaskCompletionSource,bolts.Continuation,bolts.Task,java.util.concurrent.Executor,bolts.CancellationToken)
           boolean access$400(bolts.Task)
           boolean access$502(bolts.Task,boolean)
at bolts.Task$12.bolts.Task then(bolts.Task)(Unknown Source)
at bolts.Task$12.java.lang.Object then(bolts.Task)(Unknown Source)
... 4 more
 Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:587)
... 16 more

现在最常发生这种情况的一段代码也恰好是应用程序中最关键的部分,它非常不言自明,但它是为了更新用户(我没有使用 Parse User 而是我自己的出于我自己的原因自定义用户类)在解析时,如果由于某种原因该对象不存在 e.i.被误删了,我们注册一个新的,异常总是从外部public void done(ParseObject parseUser, ParseException e)方法抛出,解析错误码总是100(ConnectionFailed - 表示连接Parse服务器失败。),代码如下:

public void updateUser(final User user) {
    ParseQuery<ParseObject> query = ParseQuery.getQuery(TABLE_NAME);

    query.getInBackground(user.getId(), new GetCallback<ParseObject>() {
        @Override
        public void done(ParseObject parseUser, ParseException e) {
            if (e == null) {
                parseUser.put(FIRST_NAME, user.getFirstName());
                parseUser.put(LAST_NAME, user.getLastName());
                parseUser.put(PASSWORD, user.getPassword());
                parseUser.put(COUNTRY, user.getCountry());
                parseUser.put(EMAIL, user.getEmail());
                parseUser.put(TELE, user.getTelephone());
                parseUser.put(IS_REGISTERED, user.isRegistered());
                parseUser.put(IS_ADMIN, user.isAdmin());
                parseUser.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e != null) {
                            TILogger.getLog().e(LOG_TAG, "Failed to save user in background with object id " + user.getId() + "to parse in ParseUserHelper.updateUser()",
                                    e, true, ParseHelper.LOG_FILE_NAME, true);
                        }
                    }
                });
            } else {
                TILogger.getLog().e(LOG_TAG, "Could not get user with object id " + user.getId() + " to update in ParseUserHelper.updateUser(), Parse error code: " + e.getCode()
                        + "\nUser information: first name = " + user.getFirstName() + ", last name = " + user.getLastName() + ", email = " + user.getEmail() + ", telephone = " + user.getTelephone(), e, true, ParseHelper.LOG_FILE_NAME, true);
                if(e.getCode() == ParseException.OBJECT_NOT_FOUND) {
                    registerUserToParse();
                }
            }
        }
    });
}

谁能帮我解决这个问题真是太棒了,我会在他们面前跪下,如果我错过了任何信息,请告诉我,我会确保更新我的帖子。

如果我没有得到答案,我会尝试通过电子邮件解析,并确保一旦找到原因,我将与大家分享这个问题,因为我知道这个问题是多么令人沮丧。

感谢堆栈溢出的伟大社区!

【问题讨论】:

    标签: java android parse-platform connection protocols


    【解决方案1】:

    我不确定是什么导致了这个错误,但我可以建议 3 件事:

    1. 在 Parse 仪表板中,转到您自定义的用户表 > 安全 > 高级,并检查是否为所有人或至少为相应的 ParseUser 对象启用了 GET。

    2. 如果一切正常,可以尝试不同的方法:使用 User.getId() 参数创建一个没有数据的对象,然后对该对象调用 fetchInBackground()。

    3. 如果这也不起作用,请联系 Parse 支持(报告错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2019-01-05
      • 2015-11-27
      相关资源
      最近更新 更多