在将图像保存到android设备时是否应该使用后台线程?
我需要从视图(android.webkit.WebView)中捕获图像,并将其保存为android设备上的PNG文件 我应该使用AsyncTasks保存图像以避免阻塞UI线程吗 我应该在AsyncTask doInBackground方法中省略哪些代码 代码:在将图像保存到android设备时是否应该使用后台线程?,android,multithreading,bitmap,android-asynctask,Android,Multithreading,Bitmap,Android Asynctask,我需要从视图(android.webkit.WebView)中捕获图像,并将其保存为android设备上的PNG文件 我应该使用AsyncTasks保存图像以避免阻塞UI线程吗 我应该在AsyncTask doInBackground方法中省略哪些代码 代码: 是的,当然你必须在后台线程中这样做。所有I/O操作都必须在后台线程上完成,因为无法保证操作完成的速度-可能需要几毫秒到几分钟(这是一个非常糟糕的情况)。所有对存储、数据库、web资源等的访问都必须在后台线程上完成 使用多个线程可能会导致同
是的,当然你必须在后台线程中这样做。所有I/O操作都必须在后台线程上完成,因为无法保证操作完成的速度-可能需要几毫秒到几分钟(这是一个非常糟糕的情况)。所有对存储、数据库、web资源等的访问都必须在后台线程上完成 使用多个线程可能会导致同步问题。仅将执行I/O操作的代码移到单独的线程 希望这有帮助:)
private void getWebScreenshot() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "IMG_" + timeStamp;
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
String filePath = storageDir + "/" + imageFileName + ".png";
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// Log.i(LOGTAG, "External Storage Available");
// Create the storage directory if it does not exist
if (!storageDir.exists()) {
// Log.i(LOGTAG,"storageDir does not exists");
if (!storageDir.mkdirs()) {
// Log.d(LOGTAG, "Failed to create the directory");
}
}
// Create bitmap screen capture
Bitmap bitmap;
View sview = findViewById(R.id.web_view);
sview.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(sview.getDrawingCache());
sview.setDrawingCacheEnabled(false);
FileOutputStream fout = null;
File imageFile = new File(filePath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fout);
fout.flush();
fout.close();
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
new String[]{imageFile.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
// Log.i(LOGTAG, "ExternalStorage Scanned " + path + ":");
// Log.i(LOGTAG, "ExternalStorage > uri: " + uri);
}
});
// Log.i(LOGTAG, "Success");
} catch (IOException e) {
e.printStackTrace();
}
}
}