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的主要内容,如果未能解决你的问题,请参考以下文章