gpt4 book ai didi

Android:这两个操作我应该使用AsyncTask吗?

转载 作者:行者123 更新时间:2023-11-30 04:57:30 25 4
gpt4 key购买 nike

我有接下来的两个方法,takescreenshots 和 saveScreenshot:

public static Bitmap takeScreenshot(View oView)
{
Bitmap oBitmap = null;

if(oView!=null) {
if (oView.getWidth()>0 & oView.getHeight()>0) {
oBitmap = Bitmap.createBitmap(oView.getWidth(),
oView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(oBitmap);

try{
oView.draw(canvas);
}catch (Exception ex){
//log or whatever
}
}
}

return oBitmap;
}

public static File saveScreenshot(Bitmap oBitmap)
{
String mPath = ApplicationContext.getActivity().getCacheDir().getAbsolutePath() + "/artandwordsshared_img.jpg";
File imageFile = new File(mPath);

try{
boolean operationOK = true;
if (imageFile.exists()){
operationOK = imageFile.delete();
}
if (operationOK) {
operationOK = imageFile.createNewFile();
}
if (operationOK) {
FileOutputStream outputStream = new FileOutputStream(imageFile);
int quality = 75;
oBitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
outputStream.flush();
outputStream.close();
}
}catch(java.io.IOException ex){
ex.printStackTrace();
}

return imageFile;
}

我使用这个“takeScreenshot”方法来捕获 View (我在我的应用程序的某些部分使用它)和另一个在设备上保存屏幕截图,我想知道我是否必须/应该(关于好实践)通过 AsyncTask 调用它们,以便它们在后台运行,或者如果根本没有必要。我目前正在为两者使用 AsyncTask,它工作得很好,但不确定它是否真的是必须的,例如,对于网络操作。

提前谢谢你。

编辑 1:添加 AsyncTask“TakeScreenshot”类。

class TakeScreenshot extends AsyncTask<String, Void, ImageProcessingResult>
{
private WeakReference<View> view2Capture;
private ImageListeners listener;
private String asyncTaskCaller;

TakeScreenshot(View view2Capture, ImageListeners listener, String asyncTaskCaller)
{
this.listener = listener;
this.view2Capture = new WeakReference<>(view2Capture);
this.asyncTaskCaller = asyncTaskCaller;
}

protected ImageProcessingResult doInBackground(String... urls)
{
Bitmap bitmap = null;
String result = Enum.Result.KO;
if(view2Capture.get()!=null)
{
bitmap = ImageHelper.takeScreenshot(view2Capture.get());
result = ImageHelper.saveBitmap(bitmap);
}

return new ImageProcessingResult(bitmap, result);
}

protected void onPostExecute(ImageProcessingResult ipr)
{
listener.onScreenCaptureFinished(ipr, asyncTaskCaller);
}
}

顺便说一句,目前从 AsyncTask 调用的 takeScreenshot 方法工作正常。只是尝试使用良好的做法,这就是我发帖的原因。

最佳答案

  1. 我不确定您能否在后台 Thread 中调用第一个函数 takeScreenshot。因为你是用UI Draw来进行操作的。无论如何,将这个小实现放在后台是没有意义的。

  2. 下一个函数saveScreenshot肯定要在后台Thread中定义。您需要消除由于在前台使用 in 而导致的 UI 卡顿。 也许您不会在新设备上感受到差异,但在某些条件/平台上您会。

更新

看来您是 Android 新手。当然,您可以使用 AsyncTask,但人们更喜欢其他工具。 AsyncTask 非常古老,现在有很多替代方案。只是尝试搜索它。

另一方面。 AsyncTask 基于 Java Executors(包括 ThreadPool、"Handler"、MessageQueue 等)。对于像您这样的简单操作,您可以只使用 Thread。简洁明了。

//Just make it once 
private final Handler ui = new Handler(
Looper.getMainLooper());

//Whenever you need just call next call
new Thread("Tag").start(() -> {
//Background Work

//Whenever you need to submit something to UI
ui.post(() -> {
// Foreground Work
});
}

})

关于Android:这两个操作我应该使用AsyncTask吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58884357/

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