0

我显示一个带有确定或取消的警报框。我想按 OK 执行异步任务。还没有完成异步并一直在努力解决它。我也不明白 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();
    }
   }
4

3 回答 3

2

由于您doInBackground()没有指定任何参数,因此您应该DoAsynchTask.execute()不带参数调用。

为什么你的类是抽象的?通常,AsyncTask 应该是启动它的 Activity 的内部类。因此,在活动中创建您的对话框,并在单击 OK 按钮时执行 AsyncTask,就像您一样。

于 2012-07-21T20:41:16.643 回答
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()是 in 的static方法时才是正确的AsyncTask,而事实并非如此。为了调用非静态execute()方法,您首先需要一个类的new实例DoAsynchTask。最后,null, null, null参数列表也不是必须的,虽然我也不认为它会导致代码失败。

于 2012-07-22T07:33:19.070 回答
1

//最终的工作副本-谢谢大家

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();
  }
 }
于 2012-07-22T14:21:08.077 回答