【问题标题】:Delay in taking screenshots截屏延迟
【发布时间】:2012-11-27 19:19:50
【问题描述】:

我的应用程序中有一个活动,它需要几个屏幕捕获并通过单击按钮移动到下一个活动。我想在截屏时向用户显示一些进度或状态(需要 5-8 秒)。我尝试使用AsyncTaskrunOnUithread()。但没有运气。即使我在doInBackground() 中编写了整个代码,我也不知道为什么在截取所有屏幕截图后会启动 ProgressDialog。这样做的更好方法是什么?这是我的代码:

public class TakeScreenShots extends AsyncTask<Void, Void, Void> {
        private ProgressDialog dialog;


            @Override
            protected void onPreExecute() {
                this.dialog = ProgressDialog.show(MyActivity.this, "MyTitle",
                        "Loading .....", true);

            }

            @Override
            protected Void doInBackground(Void... params) {
                 MyActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        takeScreenshots();

                    }
                }); 

                return null;
            }

            @Override
            protected void onPostExecute(Void unused) {
                gotoNextActivity();

                this.dialog.dismiss();

            }

        }

【问题讨论】:

  • 如果你实现了异步任务,它应该会显示进度对话框并在完成后移动到下一个活动。
  • 是的。但它不是那样做的。调用 takeScreenShots() 方法后出现进度对话框。
  • 你在 NExt 屏幕上做什么?
  • @user370305 这是一种耗时的方法。实际上它需要超过5秒。所以我想向用户展示一些进度对话框。我想那个方法里有什么应该无关紧要。它应该只在后台发生并显示进度对话框吗?
  • 没有什么只是显示所有捕获的图像。 @Sameer

标签: android android-asynctask screenshot


【解决方案1】:

不是你做错了,而是在runOnUiThread中捕获直接在doInBackground()中捕获

这是工作示例

public class backImageProcess extends AsyncTask<Void, Void, Void>
    {
private ProgressDialog dialog;
        @Override
        protected void onPreExecute() {

            this.dialog = ProgressDialog.show(MyActivity.this, "MyTitle",
                        "Loading .....", true);

            try {
                File mFile= new File(mTempImagename);
                if(mFile!=null)
                    mFile.delete();
            } catch (Exception e) {
            }   

            super.onPreExecute();
        }
        @Override
        protected Void doInBackground(Void... params) {
            mLayoutRoot.setDrawingCacheEnabled(true);
            mLayoutRoot.buildDrawingCache();

            Bitmap mBitmap= mLayoutRoot.getDrawingCache();
            try {
                if(mBitmap!=null)
                {
                    FileOutputStream out = new FileOutputStream(mTempImagename);
                    mBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                    out.flush();
                    out.close();
                }
            } catch (Exception e) { }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if(this.dialog!=null)
                this.dialog.dismiss();

            gotoNextActivity();

        }
    }

【讨论】:

  • 但我的代码实际上有一个 for 循环,可以截取许多屏幕截图。我的意思是 ImageView 的 Drawable 已更改并截取了屏幕截图。可能是 10 到 15 个屏幕截图。
  • 我尝试将我的代码保留在 doInBackground 中,就像您在进行单次捕获时所做的那样。它不起作用
  • 它会抛出这个异常:android.view.ViewRoot$CalledFromWrongThreadException
  • 你必须分享一些你的takescreen() 代码,我现在不能假设任何事情
【解决方案2】:

我从this question 的答案中得到了答案。我正在为图像视图设置一个可绘制对象。所以,我把这条线保留在 Ui Thread 中,并保留在 doInBackground() 中。

【讨论】:

  • 这个我已经在我的 cmets 中提到过如果你想改变 UI,我已经举了一个例子,在preExecute()
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2021-04-06
  • 2020-05-24
  • 2020-05-05
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多