Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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_Android Asynctask_Screenshot - Fatal编程技术网

Android 截图延迟

Android 截图延迟,android,android-asynctask,screenshot,Android,Android Asynctask,Screenshot,我在我的应用程序中有一个活动,它需要几个屏幕截图,然后点击按钮进入下一个活动。我想在截图时向用户显示一些进度或状态(需要5-8秒)。我尝试将AsyncTask与runOnUithread()一起使用。但是没有运气。即使我在doInBackground()中编写了整个代码,我也不知道为什么在截图之后ProgressDialog会启动。做这件事最好的方法是什么?这是我的密码: public class TakeScreenShots extends AsyncTask<Void, Void,

我在我的应用程序中有一个活动,它需要几个屏幕截图,然后点击按钮进入下一个活动。我想在截图时向用户显示一些进度或状态(需要5-8秒)。我尝试将
AsyncTask
runOnUithread()
一起使用。但是没有运气。即使我在
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();

            }

        }
公共类截图任务{
私人对话;
@凌驾
受保护的void onPreExecute(){
this.dialog=ProgressDialog.show(MyActivity.this,“MyTitle”,
“加载…”,正确);
}
@凌驾
受保护的Void doInBackground(Void…参数){
MyActivity.this.rununuithread(新的Runnable(){
@凌驾
公开募捐{
截图();
}
}); 
返回null;
}
@凌驾
受保护的void onPostExecute(未使用的void){
gotoNextActivity();
this.dialog.disclose();
}
}

不,您做错了,而是在
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();

        }
    }
公共类backImageProcess扩展了异步任务
{
私人对话;
@凌驾
受保护的void onPreExecute(){
this.dialog=ProgressDialog.show(MyActivity.this,“MyTitle”,
“加载…”,正确);
试一试{
File mFile=新文件(MTEMPIGENAME);
如果(mFile!=null)
mFile.delete();
}捕获(例外e){
}   
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
mLayoutRoot.setDrawingCacheEnabled(true);
mLayoutRoot.buildDrawingCache();
位图mBitmap=mLayoutRoot.getDrawingCache();
试一试{
如果(mBitmap!=null)
{
FileOutputStream out=新的FileOutputStream(mTempImagename);
mBitmap.compress(Bitmap.CompressFormat.PNG,90,out);
out.flush();
out.close();
}
}捕获(例外e){}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
if(this.dialog!=null)
this.dialog.disclose();
gotoNextActivity();
}
}

我从中的一个答案中得到了答案。我正在设置一个可绘制的图像视图。所以,我将该行保留在Ui线程上,并保留在doInBackground()中。

如果实现asynctask,它应该显示进度对话框,并在完成后移动到下一个活动。是的。但事实并非如此。调用takeScreenShots()方法后会出现进度对话框。您在下一个屏幕中做什么?@user370305这是一个耗时的方法。实际上,这需要5秒钟以上的时间。所以我想向用户显示一些进度对话框。我想那种方法有什么不重要。它应该只在后台发生,并显示一个进度对话框,对吗?什么都没有,只显示所有捕获的图像@SameerBut我的代码实际上有一个for循环,需要很多截图。我的意思是改变了ImageView的可绘制内容并拍摄了屏幕截图。可能是10到15张截图。我试着把我的代码保存在后台,就像你拍摄一张截图一样。它不起作用它引发了这个异常:android.view.ViewRoot$CalledFromErrorThreadException你必须分享你的
takescreen()
代码,我现在不能假设任何事情我在我的评论中已经提到过这一点,我已经给出了一个例子,如果你想改变UI,请在
preExecute()