AlertDialog里面的Android Asynch Task无法正常工作

时间:2012-07-21 20:33:31

标签: android android-asynctask android-alertdialog

我显示带有确定或取消的警报框。 我想在按下确定时执行异步任务。没有做过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();
    }
   }

3 个答案:

答案 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();
  }
 }