我显示带有确定或取消的警报框。 我想在按下确定时执行异步任务。没有做过asynch并且已经挣扎了一段时间。我不明白asych课程的去向。它是否超出正在执行的方法或在其外部?目前的代码如下:
private abstract class DoAsynchTask extends AsyncTask<Void,Void,Void>
{
protected void doInBackground()
{
Drawable drawable= getImage(imageSelect);
MakeWallPaper(drawable,1);
}
/* protected void onProgressUpdate(Integer... progress)
{
setProgress(progress[0]);
}*/
protected void onPostExecute()
{
Toast.makeText(getApplicationContext(), "Wallpaper Saved.",Toast.LENGTH_LONG).show();
AlertDialogProcessing=0;
}
}
public void getWallpaper(final View v)
{
if(AlertDialogProcessing==0)
{
final String title="Set Image to Wallpaper";
final String message="Press OK to set as Wallpaper or CANCEL.\nWait after pushing OK.";
final String ok="OK";
final String cancel="CANCEL";
final AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
alertbox.setCancelable(true);
alertbox.setIcon(android.R.drawable.ic_dialog_alert);
alertbox.setTitle(title);
alertbox.setMessage(message);
alertbox.setNegativeButton(cancel, null);
final AlertDialog dlg = alertbox.create();
alertbox.setPositiveButton(ok,new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dlg, int which)
{
DoAsynchTask.execute(null,null,null); //<<<<Wrong
dlg.dismiss();
Vibrate(ClickVibrate);
}
});
alertbox.setNegativeButton(cancel,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1){AlertDialogProcessing=0;
Vibrate(ClickVibrate); } });
alertbox.show();
}
}
答案 0 :(得分:2)
由于您的doInBackground()
未指定任何参数,因此您应该在没有参数的情况下调用DoAsynchTask.execute()
。
为什么你的班级是抽象的?通常,AsyncTask应该是启动它的活动的内部类。因此,在活动中创建对话框,并在单击“确定”按钮时执行AsyncTask,就像您一样。
答案 1 :(得分:2)
代码中存在一些问题。
1)首先,编译器可能会给你这样的信息:
MyActivity.DoAsynchTask类型必须实现继承的抽象 方法 AsyncTask.doInBackground(Void ...)MyActivity.java
如果仔细查看错误消息,您会发现您定义的是:
protected void doInBackground() {
这不是我们需要的。即使它看起来很愚蠢,但当您的AsyncTask
子类将Void
作为通用参数类型时,这意味着doInBackground()
必须如下所示:
protected Void doInBackground(Void... arg0) {
编译器抱怨因为你没有实现那个(精确)方法。当你从abstract
类继承并且未能实现其所需/抽象方法的所有时,你只能通过将子类标记为抽象来获得它来编译。但是,这不是你想要的。
因此,只需将代码更改为(从班级中删除abstract
):
private class DoAsynchTask extends AsyncTask<Void,Void,Void>
和
protected Void doInBackground(Void... arg0) {
{
Drawable drawable= getImage(imageSelect);
MakeWallPaper(drawable,1);
return null;
}
2)正如其他人所指出的那样,第二个问题是你必须开始执行任务:
new DoAsynchTask().execute();
不
DoAsynchTask.execute(null,null,null);
如果execute()
是static
中的AsyncTask
方法,那么您的代码才会正确,但事实并非如此。为了调用非静态execute()
方法,首先需要new
类的DoAsynchTask
实例。最后,null, null, null
参数列表也没有必要,但我认为它不会导致代码失败。
答案 2 :(得分:1)
//最终工作副本-Thanks ALL
public void getWallpaper(final View v)
{
Vibrate(ClickVibrate);
final class SetWallPaperAsynchTask extends AsyncTask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... arg0)
{
Drawable drawable= getImage(imageSelect);
MakeWallPaper(drawable,1);
return null;
}
@Override
protected void onPostExecute(Void result)
{Toast.makeText(getBaseContext(), "Wallpaper Saved.", Toast.LENGTH_LONG).show();
AlertDialogProcessing=0;
}
}
if(AlertDialogProcessing==0)
{
ProgressDialog progress;
final String title="Set Image to Wallpaper";
final String message="Press OK to set as Wallpaper or CANCEL.";
final String ok="OK";
final String cancel="CANCEL";
final AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
alertbox.setCancelable(true);
alertbox.setIcon(android.R.drawable.ic_dialog_alert);
alertbox.setTitle(title);
alertbox.setMessage(message);
alertbox.setNegativeButton(cancel, null);
final AlertDialog dlg = alertbox.create();
alertbox.setPositiveButton(ok,new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface arg0, int arg1)
{
new SetWallPaperAsynchTask().execute();
dlg.dismiss();
Vibrate(ClickVibrate);
}
});
alertbox.setNegativeButton(cancel,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1){AlertDialogProcessing=0; Vibrate(ClickVibrate); } });
alertbox.show();
}
}