简体   繁体   English

AsyncTask进度对话框未显示且仍在跳帧

[英]AsyncTask progress dialog not showing & still skipping frames

I have two AsyncTasks that contain code that save a photo and video to file. 我有两个AsyncTasks,它们包含将照片和视频保存到文件的代码。 I used working AsyncTask code from other classes I created, yet for some reason they are not working here. 我使用了我创建的其他类中的有效AsyncTask代码,但由于某些原因,它们在这里不起作用。 Here are the 2 problems: 这是两个问题:

  1. I see no progress dialog 我看不到进度对话框

  2. I still see messages in the console that say "skipped 276 frames! Doing too much work on the main thread." 我仍然在控制台中看到“跳过276帧!在主线程上做太多工作”的消息。

But how can that be when I have the saving in my doInBackground() ? 但是当我在doInBackground()进行保存时怎么doInBackground() My photo and video do actually save, so I know doInBackground() runs. 我的照片和视频确实可以保存,因此我知道doInBackground()可以运行。 But I don't know why the progress dialog boxes do not show at all. 但是我不知道为什么进度对话框根本不显示。 I looked on Stack for answers to that, but nothing addressed my situation. 我在Stack上寻找答案,但没有任何解决方案。 I have my context correct, no parameters in onPreExecute() , not using get() , and other answers to this problem did not apply. 我的上下文正确, onPreExecute()没有参数,未使用get() ,并且此问题的其他答案不适用。

Thanks for your help. 谢谢你的帮助。

UPDATE UPDATE

Thanks to @perosperK, I moved my ImageView contacts completely out of doInBackground() and this meant I had to call the click listener somewhere else. 感谢@perosperK,我将ImageView联系人完全移出了doInBackground() ,这意味着我不得不在其他地方调用单击侦听器。 I also put my Toast results in onPostExecute() and these changes totally worked! 我也将Toast结果放入onPostExecute() ,这些更改完全有效! I now see my progress dialog as expected for both photo and video. 现在,我可以看到照片和视频的进度对话框。 :) Below is the working code, although I could only post snippets of the changed code, since I had reached the character limit with StackO: :)下面是工作代码,尽管我只能发布已更改代码的摘要,因为我已经用StackO达到了字符数限制:

Working MakePhotoVideo.java 工作MakePhotoVideo.java

public void enableClickListener(){
        mImageView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // saves photo & sets to ImageView
                new SavePhotoTask().execute();
            }
        });
    } 

    private Bitmap setPic() {

        /*Taken out code ...*/

        /* Set Bitmap to the ImageView, make sure the VideoView is cleared to replace with ImageView */
        mImageView.setImageBitmap(mImageBitmap);

        // enable the click listener here, so don't save empty files before this
        enableClickListener();
        // make sure video view is invisible
        mVideoUri = null;

        return mImageBitmap;

    }

    private class SavePhotoTask extends AsyncTask<Bitmap, Void, Bitmap>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // instantiate your photo progress dialog
            progressPhoto = new ProgressDialog(MakePhotoVideo.this);

            progressPhoto.setMessage("Saving cute photo ...");
            //set the progress bar to cancelable on back button
            progressPhoto.setCancelable(true);
            progressPhoto.show();
        }

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

            photoSave(mImageBitmap);

            return mImageBitmap;

        }

        @Override
        protected void onPostExecute(Bitmap result) {
            progressPhoto.dismiss();

            if (successPhoto) {
                Toast toast = Toast.makeText(getApplicationContext(), "Cute photo saved!",
                        Toast.LENGTH_LONG);
                LinearLayout toastLayout = (LinearLayout) toast.getView();
                toastLayout.setBackgroundColor(getResources().getColor(R.color.toast_color));
                TextView toastTV = (TextView) toastLayout.getChildAt(0);
                toastTV.setTextSize(25);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 80);
                toast.show();
            } else {
                Toast.makeText(getApplicationContext(),
                        "Error during image saving", Toast.LENGTH_SHORT).show();
            }

            mImageView.setOnClickListener(null);

        }
    }

    // saves photo to SD card
    private Boolean photoSave(final Bitmap bitmapPhoto){

        /*Taken out code ...*/

        return successPhoto;

    }

    private class SaveVideoTask extends AsyncTask<Uri, Void, Uri> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // instantiate your video progress dialog
            progressVideo = new ProgressDialog(MakePhotoVideo.this);

            progressVideo.setMessage("Saving cute video ...");
            //set the progress bar to cancelable on back button
            progressVideo.setCancelable(true);
            progressVideo.show();
        }

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

            return videoSave(mVideoUri);
        }

        @Override
        protected void onPostExecute(Uri result) {
            progressVideo.dismiss();

            if (successVideo) {
                Toast toast = Toast.makeText(getApplicationContext(), "Cute video saved!",
                        Toast.LENGTH_SHORT);
                LinearLayout toastLayout = (LinearLayout) toast.getView();
                toastLayout.setBackgroundColor(getResources().getColor(R.color.toast_color));
                TextView toastTV = (TextView) toastLayout.getChildAt(0);
                toastTV.setTextSize(30);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 80);
                toast.show();
            } else {
                Toast.makeText(getApplicationContext(),
                        "Error during video saving", Toast.LENGTH_SHORT).show();
            }

        }
    }


    // enables the VideoView listener
    protected void enableTouchListener(){

        // click the video to save it
        mVideoView.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP) {

                    new SaveVideoTask().execute();

                }
                return true;
            }
        });
    }


    private void handleCameraPhoto() {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

        if (mCurrentPhotoPath != null) {
            setPic();
            galleryAddPic();
            mCurrentPhotoPath = null;
        }

    }
    // Post recorded video into VideoView
    private Uri handleCameraVideo(Intent intent) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

        mVideoUri = intent.getData();
        mVideoView.setVideoURI(mVideoUri);
        mImageBitmap = null;
        mVideoView.setVisibility(View.VISIBLE);
        mImageView.setVisibility(View.INVISIBLE);
        mVideoView.start();
        enableTouchListener();

        return mVideoUri;

    }

Below is the un-working code 下面是无效的代码

MakePhotoVideo.java MakePhotoVideo.java

    package org.azurespot.makecute;

    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.content.res.Configuration;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.support.v7.app.ActionBarActivity;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.MenuItem;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.VideoView;

    import org.azurespot.R;
    import org.azurespot.cutecollection.CuteCollection;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.Random;

    public class MakePhotoVideo extends ActionBarActivity {

        private static final int ACTION_TAKE_PHOTO = 1;
        private static final int ACTION_TAKE_VIDEO = 2;
        private static final String BITMAP_STORAGE_KEY = "viewbitmap";
        private static final String IMAGEVIEW_VISIBILITY_STORAGE_KEY = "imageviewvisibility";
        private ImageView mImageView;
        private Bitmap mImageBitmap;

        private static final String VIDEO_STORAGE_KEY = "viewvideo";
        private static final String VIDEOVIEW_VISIBILITY_STORAGE_KEY = "videoviewvisibility";
        private VideoView mVideoView;
        private Uri mVideoUri;
        private File fileVideo;

        private String mCurrentPhotoPath;
        String videoPath;
        private int position = 0;
        int targetH;
        int targetW;

        private static final String JPEG_FILE_PREFIX = "IMG_";
        private static final String JPEG_FILE_SUFFIX = ".jpg";

        private PhotoStorageDirFactory mPhotoStorageDirFactory = null;
        private ProgressDialog progressPhoto;
        private ProgressDialog progressVideo;


        /* Photo album for this application */
        private String getAlbumName() {
            return getString(R.string.album_name);
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_make_photo_video);

            // instantiate your photo progress dialog
            progressPhoto = new ProgressDialog(MakePhotoVideo.this);

            // instantiate your video progress dialog
            progressVideo = new ProgressDialog(MakePhotoVideo.this);

            mImageView = (ImageView) findViewById(R.id.taken_photo);
            mVideoView = (VideoView) findViewById(R.id.video_view);
            mImageView.setVisibility(View.VISIBLE);
            mVideoView.setVisibility(View.INVISIBLE);
            mImageView.setSaveEnabled(true);

            Button photoBtn = (Button) findViewById(R.id.click);
            setBtnListenerOrDisable(photoBtn, mTakePicOnClickListener, MediaStore.ACTION_IMAGE_CAPTURE);

            Button videoBtn = (Button) findViewById(R.id.record_video);
            setBtnListenerOrDisable(videoBtn, mTakeVidOnClickListener, MediaStore.ACTION_VIDEO_CAPTURE);

            mPhotoStorageDirFactory = new BasePhotoDirFactory();

            // Shows the up carat near app icon in ActionBar
            getSupportActionBar().setDisplayUseLogoEnabled(false);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        }


        public void viewCollection(View v){

            // finishes/restarts the activity so the unsaved video does not corrupt
            Intent intent = getIntent();
            finish();
            startActivity(intent);

            // goes to Cute Collection activity
            Intent i = new Intent(this, CuteCollection.class);
            startActivity(i);
        }

        private File getAlbumDir() {
            File storageDir = null;

            if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {

                storageDir = mPhotoStorageDirFactory.getAlbumStorageDir(getAlbumName());

                if (storageDir != null) {
                    if (! storageDir.mkdirs()) {
                        if (! storageDir.exists()){
                            Log.d("Camera", "failed to create directory");
                            return null;
                        }
                    }
                }

            } else {
                Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE.");
            }

            return storageDir;
        }

        private File createImageFile() throws IOException {
            // Create an image file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
            File albumF = getAlbumDir();
            File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF);
            return imageF;
        }

        private File setUpPhotoFile() throws IOException {

            File f = createImageFile();
            mCurrentPhotoPath = f.getAbsolutePath();

            return f;
        }


        private Bitmap setPic() {

            mImageView.setVisibility(View.VISIBLE);
            mVideoView.setVisibility(View.INVISIBLE);

            /* There isn't enough memory to open up more than a couple camera photos */
            /* So pre-scale the target bitmap into which the file is decoded */

            /* Get the size of the image */
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;

            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                targetH = 570;
                targetW = 960;
            } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
                targetH = 960;
                targetW = 570;
            }

            BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;

            /* Figure out which way needs to be reduced less */
            int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

            /* Set bitmap options to scale the image decode target */
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inPreferredConfig = Bitmap.Config.RGB_565;
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inBitmap = mImageBitmap;
            bmOptions.inPurgeable = true;


            /* Decode the JPEG file into a Bitmap */
            mImageBitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);


            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                mImageBitmap = rotateBitmap(mImageBitmap, 90);
            }

            return mImageBitmap;

        }

        private class SavePhotoTask extends AsyncTask<Bitmap, Void, Bitmap>{

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

                progressPhoto.setMessage("Saving cute photo ...");
                //set the progress bar to cancelable on back button
                progressPhoto.setCancelable(true);
                progressPhoto.show();
            }

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

                savePhoto(mImageBitmap);

                return mImageBitmap;

            }

            @Override
            protected void onPostExecute(Bitmap result) {
                progressPhoto.dismiss();

                /* Associate the Bitmap to the ImageView, make sure the VideoView
             * is cleared to replace with ImageView */
                mImageView.setImageBitmap(mImageBitmap);
                mVideoUri = null;
            }
        }

        // save your photo to SD card
        private void savePhoto(final Bitmap bitmapPhoto){
            // set OnClickListener to save the photo
            mImageView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    boolean success = false;

                    File photoDir = new File(Environment.getExternalStoragePublicDirectory
                            (Environment.DIRECTORY_PICTURES) + "/Cute Photos");
                    photoDir.mkdirs();
                    Random generator = new Random();
                    int n = 10000;
                    n = generator.nextInt(n);
                    String photoName = "Photo" + n + ".jpg";
                    File filePhoto = new File(photoDir, photoName);

                    try {
                        FileOutputStream out = new FileOutputStream(filePhoto);
                        bitmapPhoto.compress(Bitmap.CompressFormat.JPEG, 100, out);
                        out.flush();
                        out.close();
                        success = true;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    if (success) {
                        Toast toast = Toast.makeText(getApplicationContext(), "Cute photo saved!",
                                Toast.LENGTH_LONG);
                        LinearLayout toastLayout = (LinearLayout) toast.getView();
                        toastLayout.setBackgroundColor(getResources().getColor(R.color.toast_color));
                        TextView toastTV = (TextView) toastLayout.getChildAt(0);
                        toastTV.setTextSize(25);
                        toast.setGravity(Gravity.CENTER_VERTICAL, 0, 80);
                        toast.show();
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Error during image saving", Toast.LENGTH_SHORT).show();
                    }

                }
            });
        }

        private class SaveVideoTask extends AsyncTask<Uri, Void, Uri> {

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

                progressVideo.setMessage("Saving cute video ...");
                //set the progress bar to cancelable on back button
                progressVideo.setCancelable(true);
                progressVideo.show();
            }

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

                return saveVideo(mVideoUri);
            }

            @Override
            protected void onPostExecute(Uri result) {
                progressVideo.dismiss();

            }
        }


        // save your video to SD card
        protected Uri saveVideo(final Uri uriVideo){

            // click the video to save it
            mVideoView.setOnTouchListener(new View.OnTouchListener() {

                boolean success = false;
                boolean savedOnce = false;

                public boolean onTouch(View v, MotionEvent event) {

                    if(event.getAction() == MotionEvent.ACTION_UP) {

                        if (mVideoView.isPlaying()) {
                            mVideoView.pause();
                        }

                        if (!savedOnce) {

                            try {
                                // make the directory
                                File vidDir = new File(android.os.Environment
                                        .getExternalStoragePublicDirectory
                                                (Environment.DIRECTORY_MOVIES) +
                                        File.separator + "Cute Videos");
                                vidDir.mkdirs();

                                // create unique identifier
                                Random generator = new Random();
                                int n = 100;
                                n = generator.nextInt(n);
                                // create file name
                                String videoName = "Video" + n + ".mp4";

                                fileVideo = new File(vidDir.getAbsolutePath(), videoName);

                                videoPath = fileVideo.getAbsolutePath();

                                fileVideo.setWritable(true, false);

                                OutputStream out = new FileOutputStream(fileVideo);
                                InputStream in = getContentResolver().openInputStream(uriVideo);

                                byte buffer[] = new byte[1024];
                                int length = 0;
                                while ((length = in.read(buffer)) > 0) {
                                    out.write(buffer, 0, length);
                                }

                                out.close();
                                in.close();

                                success = true;

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            if (success) {
                                Toast toast = Toast.makeText(getApplicationContext(), "Cute video saved!",
                                        Toast.LENGTH_SHORT);
                                LinearLayout toastLayout = (LinearLayout) toast.getView();
                                toastLayout.setBackgroundColor(getResources().getColor(R.color.toast_color));
                                TextView toastTV = (TextView) toastLayout.getChildAt(0);
                                toastTV.setTextSize(30);
                                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 80);
                                toast.show();
                            } else {
                                Toast.makeText(getApplicationContext(),
                                        "Error during video saving", Toast.LENGTH_SHORT).show();
                            }

                            savedOnce = true;
                        }
                    }

                    return true;
                }
            });

            return uriVideo;
        }


        public Bitmap rotateBitmap(Bitmap source, int angle)
        {
            Matrix matrix = new Matrix();
            matrix.set(matrix);
            matrix.setRotate(angle);
            return Bitmap.createBitmap(source, 0, 0, source.getWidth(),
                    source.getHeight(), matrix, false);
        }

        private void galleryAddPic() {
            Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
            File f = new File(mCurrentPhotoPath);
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);
            this.sendBroadcast(mediaScanIntent);
        }

        private void dispatchTakePictureIntent(int actionCode) {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            switch(actionCode) {
                case ACTION_TAKE_PHOTO:
                    File f;

                    try {
                        f = setUpPhotoFile();
                        Log.d("TAG", "Value of f in picture intent: " + f);
                        mCurrentPhotoPath = f.getAbsolutePath();
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                    } catch (IOException e) {
                        e.printStackTrace();
                        f = null;
                        mCurrentPhotoPath = null;
                    }
                    break;

                default:
                    break;
            } // switch

            startActivityForResult(takePictureIntent, actionCode);
        }

        // Captures video from Android camera component
        protected void dispatchTakeVideoIntent() {
            Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
                // set the video image quality to high
                takeVideoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                // limit video to 30 seconds
                takeVideoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30);
                startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO);
            }
        }

        private void handleCameraPhoto() {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

            if (mCurrentPhotoPath != null) {
                setPic();
                // saves photo & sets to ImageView
                new SavePhotoTask().execute();
                galleryAddPic();
                mCurrentPhotoPath = null;
            }

        }
        // Post recorded video into VideoView
        private Uri handleCameraVideo(Intent intent) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

            mVideoUri = intent.getData();
            mVideoView.setVideoURI(mVideoUri);
            mImageBitmap = null;
            mVideoView.setVisibility(View.VISIBLE);
            mImageView.setVisibility(View.INVISIBLE);
            mVideoView.start();

            new SaveVideoTask().execute();

            return mVideoUri;

        }

        // click listener for the Android Camera button (not my app's button)
        Button.OnClickListener mTakePicOnClickListener =
                new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dispatchTakePictureIntent(ACTION_TAKE_PHOTO);
                        // releases the orientation lock
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                    }
                };
        Button.OnClickListener mTakeVidOnClickListener =
                new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dispatchTakeVideoIntent();
                        // releases the orientation lock
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                    }
                };

        // Intent data is how the photo and video transfer into their views
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
                case ACTION_TAKE_PHOTO: {
                    if (resultCode == RESULT_OK) {
                        handleCameraPhoto();
                    }
                    break;
                }
                case ACTION_TAKE_VIDEO: {
                    if (resultCode == RESULT_OK) {
                        handleCameraVideo(data);
                    }
                    break;
                }
            }
        }

       /*Taken out code ...*/


}

Do following changes to use AsyncTask properly with current implementation : 进行以下更改以在当前实现中正确使用AsyncTask

1. Move onclick method code of mImageView button inside doInBackground 1.移动的onclick方法代码mImageView内部按钮doInBackground

2. Add if (success) {...}else{...} block in onPostExecute from onclick of mImageView button 2.mImageView按钮的onclick中在onPostExecute添加if (success) {...}else{...}

3. Start SavePhotoTask Task on mImageView Button click to do heavy task in background Thread 3.mImageView Button上启动SavePhotoTask Task单击以在后台线程中执行繁重的任务

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM