我的应用程序中有一个活动,它需要多次屏幕截图并在按钮点击时转到下一个活动。我想在截取屏幕时向用户显示一些进度或状态(需要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();
}
}
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
我从this question的答案中得到了答案。我正在为图像视图设置一个drawable。所以,我在Ui Thread上保留了这一行并保留在doInBackground()中。