我正在编写一个应用程序,将图像存储在Google云端硬盘中,我想显示这些图库(GridView).为了更高效(即异步),我想将其与毕加索结合起来.但是Picasso.load(String)只是一个加载的别名(Uri.parse(path)),我没有Uri,因为图像是这样加载的(简化和未公开的实用程序方法):
- public static Bitmap getBitmap(DriveId id) {
- GoogleApiClient client = ApiClientAsyncTask.createConnectedClient(App.getAppContext());
- DriveFile file = Drive.DriveApi.getFile(client,id);
- Metadata Meta = sync(file.getMetadata(client));
- Contents contents = sync(file.openContents(client,DriveFile.MODE_READ_ONLY,null));
- InputStream imageStream = contents.getInputStream();
- try {
- return BitmapFactory.decodeStream(imageStream);
- } finally {
- IOTools.ignorantClose(imageStream);
- sync(file.discardContents(client,contents));
- }
- }
是否有任何其他类似的库可能支持任意输入(String / Object)的集成?
解决方法
当时毕加索的版本不支持我想要的东西所以我去使用了
Glide 3.这就是我设法放在一起的东西.
我还没有测试它,我把它从历史中拼凑起来,因为我从我的应用程序中删除了这个支持,这是一个过度杀伤力;但是当功能仍然存在时,它正在工作.
我还没有测试它,我把它从历史中拼凑起来,因为我从我的应用程序中删除了这个支持,这是一个过度杀伤力;但是当功能仍然存在时,它正在工作.
在ConnectionCallbacks.onConnected中:
- Glide.get(getContext()).register(DriveId.class,InputStream.class,new DriveIdModelLoader.Factory(mClient));
在ConnectionCallbacks.onConnectionSuspended中:
- Glide.get(getContext()).unregister(DriveId.class,InputStream.class);
在列表适配器:
- String driveString = cursor.getString(cursor.getColumnIndex("image"));
- DriveId driveId = DriveId.decodeFromString(driveString);
- Glide.with(this)
- .from(DriveId.class)
- .load(driveId)
- .into(imageView);
滑胶:
- import java.io.*;
- import android.content.Context;
- import android.net.Uri;
- import com.bumptech.glide.load.data.DataFetcher;
- import com.bumptech.glide.load.model.*;
- import com.bumptech.glide.load.model.stream.StreamModelLoader;
- import com.google.android.gms.common.api.GoogleApiClient;
- import com.google.android.gms.drive.DriveId;
- public class DriveIdModelLoader implements StreamModelLoader<DriveId> {
- private final GoogleApiClient client;
- public DriveIdModelLoader(GoogleApiClient client) {
- this.client = client;
- }
- public DataFetcher<InputStream> getResourceFetcher(DriveId model,int width,int height) {
- return new DriveIdDataFetcher(client,model);
- }
- public static class Factory implements ModelLoaderFactory<DriveId,InputStream> {
- private final GoogleApiClient client;
- public Factory(GoogleApiClient client) {
- this.client = client;
- }
- public ModelLoader<DriveId,InputStream> build(Context context,GenericLoaderFactory factories) {
- return new DriveIdModelLoader(client);
- }
- public void teardown() {
- client.disconnect();
- }
- }
- }
驱动相关的Glide逻辑:
- import java.io.InputStream;
- import org.slf4j.*;
- import com.bumptech.glide.Priority;
- import com.bumptech.glide.load.data.DataFetcher;
- import com.google.android.gms.common.api.*;
- import com.google.android.gms.drive.*;
- public class DriveIdDataFetcher implements DataFetcher<InputStream> {
- private static final Logger LOG = LoggerFactory.getLogger(DriveIdDataFetcher.class);
- private final GoogleApiClient client;
- private final DriveId driveId;
- private boolean cancelled = false;
- private DriveFile file;
- private Contents contents;
- public DriveIdDataFetcher(GoogleApiClient client,DriveId driveId) {
- this.client = client;
- this.driveId = driveId;
- }
- public String getId() {
- return driveId.encodeToString();
- }
- public InputStream loadData(Priority priority) {
- if (cancelled) return null;
- if (client == null) {
- LOG.warn("No connected client received,giving custom error image");
- return null;
- }
- file = Drive.DriveApi.getFile(client,driveId);
- if (cancelled) return null;
- contents = sync(file.openContents(client,null)).getContents();
- if (cancelled) return null;
- return contents.getInputStream();
- }
- public void cancel() {
- cancelled = true;
- if (contents != null) {
- file.discardContents(client,contents);
- }
- }
- public void cleanup() {
- if (contents != null) {
- sync(file.discardContents(client,contents));
- }
- }
- private static <T extends Result> void assertSuccess(T result) {
- if (!result.getStatus().isSuccess()) {
- throw new IllegalStateException(result.getStatus().toString());
- }
- }
- private static <T extends Result> T sync(PendingResult<T> pending) {
- T result = pending.await();
- assertSuccess(result);
- return result;
- }
- }