在上一个活动(活动A)中注册下一个活动(活动B)作为AsyncTask的回调

时间:2018-01-09 12:24:06

标签: android android-activity bitmap android-asynctask callback

我有一个非常具体的用例我想实现,但我不太清楚该怎么做。

方案:

我有一个活动(称之为ActivityA),它从特定的URL加载(最多10个)图像,并在自定义ViewPager中显示它们。我创建了一个类(让我们说AttributedPhotos)来保存位图及其归属。这个类实现了Parcelable。

然后我向这个ViewPager注册了一个OnTouchListener,这样如果用户触摸ViewPager就可以在另一个Activity中全屏打开图像,用户可以通过向左和向右滑动来导航它们(并捏缩放等等,基本上互动与他们在全屏))。起初我尝试将图像作为AttributedPhotos( intent.putParcelableArrayListExtra(“attr-photos”,myPhotos)的ArrayList传递给下一个Activity,但后来得到错误消息 E / JavaBinder :!!!失败的BINDER TRANSACTION !!! 这显然意味着Intent中没有足够的空间用于此ArrayList。这是有道理的,因为ArrayList包含10个500x500位图。所以我在StackOverflow中搜索并找到了我的问题here的解决方案,它基本上将图像存储在ActivityA的设备内存中并将它们加载到ActivityB中。我实现了辅助类,它们异步地从/向缓存目录读取/写入图像(ImageLoader和ImageSaver都使用静态方法)。这似乎对我有用但是我希望ActivityB只在ActivityA完成保存时加载图像,这就是我的问题所在。

问题

有没有办法通知ActivityB ActivityA完成了将图像写入缓存?我想到了类似的东西:

Activity A:

ImageSaver saver = new ImageSaver(...);
saver.setCallback(activityB);
saver.execute();
startActivity(activityB);


Activity B implements OnSavedListener:

@Override
public void onImagesSaved() {
    ImageLoader loader = new ImageLoader(viewPager,...); // ViewPager instance to set the images after loading (in onPostExecute())
    loader.execute();
}

简要说明:我希望活动A将活动B设置为回调对象,以便ImageSaver在保存所有图像时调用activityB。同时,activityA启动了activityB(它显示了一个进度微调器,直到加载了图像)......或类似的东西。

现在我通过intent发送activityB的arraylist大小,并实现了一个方法来检查相应的cache-subdirectory中的文件数是否等于activityB中AttributedPhotos的arraylist的大小,并且每秒调用此方法。仅当文件数等于arraylist的大小时,才会加载图像。这显然是一个肮脏的黑客。至少对我来说这似乎是一个肮脏的黑客。该解决方案的一个问题是如果最后的位图需要例如5秒钟被写入,那么activityB无法读取最后一个图像,因为一旦创建了最后一个文件,文件的数量是正确的,但是因为读取比写入快得多, activityB可以在完成最后一个文件之前读取所有文件。

如果可能的话,我希望有一个更强大的解决方案。最好像上面的伪代码。

提前谢谢!

0 个答案:

没有答案