我是Parse和Android API的新手。我想要获取用户的图片,但问题是我们在获取这些图片后无法获取这些图片。确切地说,我使用了Loader
,在onLoadFinished
中提取图片后,我无法取回onCreateLoader
方法中的图片。
我该如何管理?
当前代码:
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());
}
}
});
}
答案 0 :(得分:0)
您是在循环中遇到性能问题还是其他类型的缺陷?
IMO - 代码中的内部循环
file.getDataInBackground
有一些与可伸缩性相关的原因以及解析SDK如何实现支持&#34; InBackground&#34;的AsyncTask细节的细节。我链接到另一个线程,进入为什么它可能不是一个好主意然后循环调用&#34; inBackground&#34;输入东西,因为它们可能没有AsnycTask部分的高优先级,或者它们可能仍然是单线程,你只会陷入循环结构中,使用diff循环管理器可以更快地运行。
如果你只有一个用户并且代码运行正常可能意味着它没有更大的数组,必须循环通过迭代步骤:
获取与照片对应的网址
将GET的响应流解码为位图
我建议您考虑获取网址列表,然后
使用多连接的threadPool
Get the Photo
pass the response stream to a bitmap decoder
我使用解析对此进行了测试,使用Parse的AsnycTask版本获得了3个SECONDS和8分钟,我知道这个版本是单线程的。