Java 从Android解析API获取图像时出现问题
我对解析和Android API还不熟悉。我想获取我的用户的图片,但问题是在获取这些图片后,我无法获取这些图片。确切地说,我使用了加载程序,在onCreateLoader中获取图片后,我无法在onLoadFinished方法中获取图片 我该怎么办 当前代码:Java 从Android解析API获取图像时出现问题,java,android,android-asynctask,parse-platform,Java,Android,Android Asynctask,Parse Platform,我对解析和Android API还不熟悉。我想获取我的用户的图片,但问题是在获取这些图片后,我无法获取这些图片。确切地说,我使用了加载程序,在onCreateLoader中获取图片后,我无法在onLoadFinished方法中获取图片 我该怎么办 当前代码: public Loader<List<ParseUser>> onCreateLoader(int id, Bundle args) { return new ThrowableLoader<List&
public Loader<List<ParseUser>> onCreateLoader(int id, Bundle args) {
return new ThrowableLoader<List<ParseUser>>(getActivity(), users) {
// where ThrowableLoader simply extends AsyncLoader which implements loadData
@Override
public List<ParseUser> loadData() throws Exception {
try {
if(getActivity() != null) {
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.orderByAscending(Constants.ParseConstants.KEY_USERNAME);
query.setLimit(10);
users = query.find();
bitmap = new Bitmap[users.size()];
for(ParseUser user : users) {
ParseFile file = (ParseFile) user.get("picture");
if(file != null)
file.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (e == null) {
bitmap[0] = BitmapFactory.decodeByteArray(data, 0, data.length); // here I put this bitmap[0] as a test purpose
}
else {
System.out.println("Loading image failed for the user" + e.getMessage());
}
}
});
}
您是否在循环中存在性能问题,或者是其他类型的缺陷 IMO-代码中的内部循环
file.getDataInBackground
突出的几个原因与可伸缩性和parse SDK如何实现支持InBackground的AsyncTask的细节有关。我链接到了另一个线程,它解释了为什么在循环中调用inBackground类型的东西可能不是一个好主意,因为它们可能在AsnycTask块上没有高优先级,或者它们仍然是单线程,您将陷入一个循环构造中,使用diff循环管理器可以运行得更快
如果您只有一个用户,并且代码运行正常,这可能意味着没有更大的数组(必须循环执行以下迭代步骤),代码运行正常:
获取与照片对应的URL
解码获取位图的响应流
我建议您考虑获取URL的列表,然后考虑
使用多个连接的线程池
Get the Photo
pass the response stream to a bitmap decoder
我用parse对此进行了测试,使用parse版本的AsnycTask在循环器中得到了3秒而不是8分钟,我知道当时是单线程的。如果userList大小只有1个用户,你会得到什么结果?用户包装getDatainBackground的循环在所有IMO中都不太可能很好地扩展。我将考虑获取用户照片的url列表,然后花一些时间优化网络GET和存储为解析文件的照片url列表上的Bmp.decode。@RobertRowntree抱歉,我不理解您的响应。您的意思是我需要使用Loader查询用户,然后为每个用户存储ParseFile对象ParseFile file=ParseFile user.getpicture;。但是,我需要运行getDataInBackground,我该在哪里运行呢?谢谢你的详细回复,但很抱歉我对Android非常陌生,你能提供一些关于多连接线程池的文档链接吗?