在异步任务中显示对话框

时间:2013-11-28 18:39:45

标签: android email asynchronous dialog toast

我正在尝试使用async方法发送电子邮件,如下所示,一切正常......

现在我想在成功的电子邮件上显示一个对话框。

这是我的异步代码:

  public void sending(View v) {
    try {   
        LongOperation l=new LongOperation();
        l.execute();
        Toast.makeText(this, l.get(), Toast.LENGTH_SHORT).show();

    } catch (Exception e) {   
        Log.e("SendMail", e.getMessage(), e);  
    } 
}

public class LongOperation extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... params) {
        try{GMailSender sender = new GMailSender("XXX@gmail.com","Pwd");
        sender.sendMail("Sub",   
                "body",   
                "sender",   
                "recepient");
        }
        catch(Exception e){Log.e("error",e.getMessage(),e);return "Email Not Sent";}
        return "Email Sent";
    }

    @Override
    protected void onPostExecute(String result) 
    {

    }
    @Override
    protected void onPreExecute() 
    {
    }

    @Override
    protected void onProgressUpdate(Void... values) 
    {
    }

在上面的代码中,如果没有发送邮件,我正在举报“发送电子邮件”,如果没有发送电子邮件,我会收到“未发送电子邮件”

1)在吐司的地方,我想显示一个对话框。

2)我已经在 onPostExecute 中完成了它并且运行正常。

但是问题就出现了。假如没有互联网连接并且用户点击按钮“电子邮件未发送”并且对话框在onPostExecute方法之后显示。

我只想显示对话框。

那么如何修改上面的代码以删除祝酒词,只获取成功和不成功的电子邮件对话框。

这是我的对话框代码:

new AlertDialog.Builder(MainActivity.this)
        .setTitle("Info")
        .setMessage("Sample message.")
        .setPositiveButton("OK",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
        Log.d("AlertDialog","Positive");
    }}).show();

1 个答案:

答案 0 :(得分:1)

仍然不能完全确定我理解这个问题,但也许这就是你想要的。

public void sending(View v) {
try {   
    LongOperation l=new LongOperation();
    l.execute();
} catch (Exception e) {   
    Log.e("SendMail", e.getMessage(), e);  
} 

}

 public class LongOperation extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
    try{GMailSender sender = new GMailSender("XXX@gmail.com","Pwd");
    sender.sendMail("Sub",   
            "body",   
            "sender",   
            "recepient");
    }
    catch(Exception e){Log.e("error",e.getMessage(),e);return "Email Not Sent";}
    return "Email Sent";
}

@Override
protected void onPostExecute(String result) 
{
    if ("Email Sent".equals(result))
    {
        new AlertDialog.Builder(MainActivity.this)
        .setTitle("Info")
        .setMessage("Sample message.")
        .setPositiveButton("OK",new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog,int which) {
       Log.d("AlertDialog","Positive");
       }}).show();

}
@Override
protected void onPreExecute() 
{
}

@Override
protected void onProgressUpdate(Void... values) 
{
}

我只是删除了Toast,因为你根本不需要它。然后我将Dialog代码放在onPostExecute()中,并检查了从result传递给它的doInBackground()代码。我只在result"Email Sent"时展示了它。您可以将其更改为从result传回不同的doInBackground()(如果未发送),并在Dialog中显示不同的消息。

修改

我几乎忘了提,你几乎不想在.get()上使用AsyncTask。这是一个阻塞调用,这意味着一切都会停止,直到你的任务完成。您更新UI以外的任何任务方法中的doInBackground(),或者使用interface进行回调。

See this answer if you need an interface