2013-11-28 2 views
0

Я пытаюсь отправить электронную почту, используя метод асинхронного, как показано ниже, и все работает нормально ..диалога Отображения в асинхронной задаче

Теперь я хотел бы, чтобы отобразить диалог по электронной почте преуспевающей.

Это мой асинхронной код:

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("[email protected]","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) 
    { 
    } 

В приведенном выше коде, если почта не отсылается я получаю тост как «Письмо отправлено» и если не отправить по электронной почте я получил бы «Email Not Sent»

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(); 
+0

Я смущен. Если вы не хотите, чтобы «Тост» показывал тогда, почему бы вам не принять это? Какая проблема? – codeMagic

+0

Этот код я взял из другого приложения, но я новичок в этой концепции Android. Так вы можете показать мне, как это сделать? – coder

+0

Просто удалите «Toast». Вы сказали, что код «Диалог» находится в вашем 'onPostExecute()', поэтому я не вижу проблемы – codeMagic

ответ

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("[email protected]","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

+0

@ codeMagic-Спасибо за быстрый ответ ... Это сделал волшебство :) – coder

+0

Я рад его работе. См. Мое изменение об использовании '.get()'. – codeMagic

 Смежные вопросы

  • Нет связанных вопросов^_^