ParseObject.saveInBackground 方法以 java.net.SocketTimeoutException 结尾:将数据保存到 Parse.com 时为 null

Posted

技术标签:

【中文标题】ParseObject.saveInBackground 方法以 java.net.SocketTimeoutException 结尾:将数据保存到 Parse.com 时为 null【英文标题】:ParseObject.saveInBackground method ending with java.net.SocketTimeoutException: null while saving data to Parse.com 【发布时间】:2014-10-25 13:33:20 【问题描述】:

我查看了过去关于同一问题的帖子 (saveinbackground-doesnt-work)。

我正在尝试让以下代码与 Parse.com 一起使用:

sendMessage.saveInBackground(new SaveCallback() 
        @Override
        public void done(ParseException e) 
            setProgressBarIndeterminateVisibility(false);
            Log.d("Error","Completed Done");
            if (e==null)
                Toast.makeText(RecipientsActivity.this,"Message Sent!",Toast.LENGTH_LONG).show();
             else 
                Log.d("TAG",e.getMessage());
                Log.d("TAG",e.getCode() + "error code");

            
        
    );


此 saveinBackground 方法执行时间过长,执行时会出现以下错误: i/o 失败:java.net.SocketTimeoutException:null 100错误码

我也在应用程序的其他部分中使用 Parse,其中我正在从 Parse Core 获取用户联系信息。

消息是用于在 parse.com 上发布图片和视频的新类我使用以下代码创建 ParseObject:

protected ParseObject createMessage()
ParseObject message = new ParseObject(ParseConstants.CLASS_MESSAGES);
    message.put(ParseConstants.KEY_SENDER_ID,ParseUser.getCurrentUser().getObjectId());
    message.put(ParseConstants.KEY_SENDER_NAME,ParseUser.getCurrentUser().getUsername());
    message.put(ParseConstants.KEY_RECIPIENTS_ID,getRecipientsIDs());
    message.put(ParseConstants.KEY_FILE_TYPE,fileType);
    //Log.d("TAG1","Message: " + message);
    //Log.d("TAG1",mediaUri + "");

    byte[] fileBytes = FileHelper.getByteArrayFromFile(this,mediaUri);

    if (fileBytes==null) return null;
    else 
            if (fileType.equals(ParseConstants.FILE_TYPE_IMAGE))
            fileBytes = FileHelper.reduceImageForUpload(fileBytes);

     
        String fileName = FileHelper.getFileName(this,mediaUri,fileType);
        ParseFile parseFile = new ParseFile(fileName,fileBytes);
        message.put(ParseConstants.KEY_FILE,parseFile);
       // Log.d("TAG2","Message: " + fileType);
       // Log.d("TAG2",mediaUri + "");
        return message;
    

我检查了日志,发现消息已正确创建。此外,我检查了 Parse.com 以查看是否在那里创建了任何消息类,但没有显示任何消息类。

我得到的错误是这样的:

10-25 19:23:08.695  11405-11405 W/System.err﹕ com.parse.ParseException: Upload to S3 failed. Bad Request
10-25 19:23:08.695  11405-11405 W/System.err﹕ at com.parse.ParseAWSRequest.onResponse(ParseAWSRequest.java:94)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at com.parse.ParseAWSRequest.onResponse(ParseAWSRequest.java:28)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at com.parse.ParseRequest$3.call(ParseRequest.java:267)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at com.parse.Task$3.run(Task.java:199)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-25 19:23:08.695  11405-11405/ W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

在尝试调试错误后,我发现如果我删除附加图像的代码,它可以正常工作。所以我尝试了各种方法将图像转换为字节 [],包括 image uri to byte array 和 saving files to parse,但我仍然没有找到任何运气

【问题讨论】:

有人请帮帮我.. 过去一天我对此感到震惊 【参考方案1】:

如果有人在这里被击中:

我与我发送给解析的文件名发生冲突,并且我在创建文件时给了该文件,因此发生了这个问题。

这是将图像转换为字节的问题,而不是解析端的错误。

转换为字节的代码(以下代码包含对 imageview 问题的修复):

 public byte[] readBytes(Uri uri) throws IOException 
       /* // this dynamically extends to take the bytes you read
        InputStream inputStream = getContentResolver().openInputStream(uri);
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        // this is storage overwritten on each iteration with bytes
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        // we need to know how may bytes were read to write them to the byteBuffer
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) 
            byteBuffer.write(buffer, 0, len);
        

        // and then we can return your byte array.
        return byteBuffer.toByteArray();

        */
        byte[] data = null;
        try 
            ContentResolver cr = getBaseContext().getContentResolver();
            InputStream inputStream = cr.openInputStream(uri);
            Bitmap bitmap;
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPurgeable = true;

            options.outHeight = 50;
            options.outWidth = 50;
            options.inSampleSize = 8;
            bitmap= BitmapFactory.decodeStream(inputStream,null,options);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            data = baos.toByteArray();
            bitmap.recycle();
            System.gc();
            Runtime.getRuntime().gc();
         catch (FileNotFoundException e) 
            e.printStackTrace();
        
        return data;
    

【讨论】:

你是如何将图像转换为字节的,你可以发布你的代码吗? @azzits 我已经添加了代码。我在尝试检索图像时遇到了问题,所以我保留了它以防万一。

以上是关于ParseObject.saveInBackground 方法以 java.net.SocketTimeoutException 结尾:将数据保存到 Parse.com 时为 null的主要内容,如果未能解决你的问题,请参考以下文章