gpt4 book ai didi

android - 从后台 View 创建位图

转载 作者:行者123 更新时间:2023-11-29 21:43:18 27 4
gpt4 key购买 nike

在我的 android 应用程序中,在某个 Activity 中,我需要创建 View 的屏幕截图而不实际显示它们。我通过 inflatedView 并将它们保存为位图成功地实现了这一点。但在某些情况下,这些位图的数量足够大,创建它们需要花费大量时间。因此,手机上的用户界面变得无响应。有什么办法可以在后台完成整个过程吗?我已经尝试在异步任务中实现它,但这不起作用,因为它不允许在异步任务中扩充 View 。

非常感谢任何建议。

最佳答案

AsyncTask doBackground 方法在另一个线程上工作,这就是您无法 inflatedView 的原因。

首先你有一个布局还是多个布局。如果您有很多,请尝试以下操作。

我还没有测试过这个。只是给你的一个例子。

public class Task extends AsyncTask<Void, Integer, Void>
{
private ArrayList<Integer> layoutIds;
private View currentView;
private LayoutInflater inflater;
private Object lock = new Object();

public Task(Context context) {
super();
inflater = LayoutInflater.from(context);
}

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... params) {

Bitmap temp;

for (int i = 0; i < layoutIds.size(); i++) {

temp = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(temp);

synchronized (lock) {
publishProgress(i);

try {
// Wait for the UI Thread to inflate the layout.
lock.wait();
}
catch (InterruptedException e) {

}
}

currentView.draw(canvas);

// Now save this bitmap
try {
FileOutputStream stream = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "File_" + i + ".png"));
temp.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.flush();
stream.close();
} catch (Exception e) {

}
finally
{
if(temp != null)
{
temp.recycle();
temp = null;
}
}
}

return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
synchronized (lock) {
currentView = inflater.inflate(layoutIds.get(values[0]), null);
// Notify async thread that inflate is done.
lock.notifyAll();
}
}

}

已编辑

这里我们有两个线程,一个是 AsyncTask,它是一个线程池,另一个是 UI 线程。

使用同步块(synchronized block),我们可以确保只有一个线程可以使用对象锁,只要它不处于休眠状态或等待另一个线程。

因此,如果一个线程正在执行 synchronize 内部的 block ,那么它将开始监视该对象并确保不会执行其他也具有该对象的同步块(synchronized block)的线程。即,只要 Activity 线程进入休眠状态或在同步块(synchronized block)内完成其执行,另一个线程就必须等待。

有关更多说明,请参阅 this

在这里,我们使用同步块(synchronized block)来等待 UI 线程完成。

因此,当它执行 lock.wait() 时,AsyncThread 将等待另一个线程调用同一对象上的通知。当 lock.notifyAll() 被调用时,所有正在等待的线程(AsyncThread)将被恢复。

关于android - 从后台 View 创建位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16522815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com