Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将图像保存到android设备时是否应该使用后台线程?_Android_Multithreading_Bitmap_Android Asynctask - Fatal编程技术网

在将图像保存到android设备时是否应该使用后台线程?

在将图像保存到android设备时是否应该使用后台线程?,android,multithreading,bitmap,android-asynctask,Android,Multithreading,Bitmap,Android Asynctask,我需要从视图(android.webkit.WebView)中捕获图像,并将其保存为android设备上的PNG文件 我应该使用AsyncTasks保存图像以避免阻塞UI线程吗 我应该在AsyncTask doInBackground方法中省略哪些代码 代码: 是的,当然你必须在后台线程中这样做。所有I/O操作都必须在后台线程上完成,因为无法保证操作完成的速度-可能需要几毫秒到几分钟(这是一个非常糟糕的情况)。所有对存储、数据库、web资源等的访问都必须在后台线程上完成 使用多个线程可能会导致同

我需要从视图(android.webkit.WebView)中捕获图像,并将其保存为android设备上的PNG文件

我应该使用AsyncTasks保存图像以避免阻塞UI线程吗

我应该在AsyncTask doInBackground方法中省略哪些代码

代码:


是的,当然你必须在后台线程中这样做。所有I/O操作都必须在后台线程上完成,因为无法保证操作完成的速度-可能需要几毫秒到几分钟(这是一个非常糟糕的情况)。所有对存储、数据库、web资源等的访问都必须在后台线程上完成

使用多个线程可能会导致同步问题。仅将执行I/O操作的代码移到单独的线程

希望这有帮助:)

  • 答案是肯定的,你不想阻止你的UI线程。 更好的解决方案是将图像保存在其他线程中,同时通知用户,以便用户知道图像正在保存(启用按钮,加载gif…)

  • 线程中的所有内容都可以接受您获取时间戳的部分,因为您可能会意外地创建两个同名文件

  •     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();
            }
        }
    }