Тост в onPostExecute() в Android

#android #android-asynctask

#Android #android-asynctask

Вопрос:

Я пытаюсь опубликовать тост в OnPostExecture в асинхронном режиме.

Вот что я сделал, но это не регистрируется и не поджаривается.

 protected class sendDetails extends AsyncTask<Context, Integer, Boolean>
{

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }

        sendEmail();
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
        runOnUiThread(new Runnable() 
        {
            public void run() 
            {
                Toast.makeText(mContext, "Email Succesfully Sent...", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        finish();
    }
}
  

Я также попробовал следующее:

Объявление контекста:

  private Context mContext;
  

//Вызов асинхронного

 new sendDetails(mContext).execute();
  

//Асинхронный код:

 protected class sendDetails extends AsyncTask<Context, Integer, Boolean>
{

    public sendDetails(final Context context) 
    {
        mContext = context;
    }

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }

        sendEmail();
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
        runOnUiThread(new Runnable() 
        {
            public void run() 
            {
                Toast.makeText(mContext, "Email Succesfully Sent...", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        finish();
    }
}
  

Оба не сработали. Как поджаривать из асинхронности .. Кто-нибудь может помочь мне это исправить?

Обновить:

Изменено в соответствии с JDJ, matiash amp; RajaReddy PolamReddy

удалите Finish(); в onPreExecute. И добавил следующее в onPostExecute:

  Toast.makeText(MainActivity.this, "Email Succesfully Sent...", Toast.LENGTH_SHORT).show();
 finish();
  

Спасибо!

Комментарии:

1. просто удалите finish(), и все готово, более того, вам не нужно вызывать runOnUiThread в методе onPostExecute, этот метод вызывает сам себя в потоке пользовательского интерфейса

Ответ №1:

Вам не нужно вызывать runOnUiThread() in onPostExecute() … на данный момент он уже находится в потоке пользовательского интерфейса.

Итак, ваш onPostExecute () должен выглядеть следующим образом:

 @Override
protected void onPostExecute(Boolean result) 
{
    Toast.makeText(mContext, 
                   "Email Succesfully Sent...", 
                   Toast.LENGTH_SHORT).show();
}
  

И, finish() изменив вашу активность в onPreExecute() перед запуском фонового потока, после завершения фонового потока и вызова onPostExecute(), mContext в onPostExecute(), который вы передаете в конструктор Toast, возможно, даже больше не будет действительным.

Комментарии:

1. Я не получаю тост, если добавляю тост напрямую.

2. Вы пытались удалить вызов finish () в onPreExecute()?

3. Да. Я удалил завершение, а затем добавил: Toast.makeText (main.this, «Электронное письмо успешно отправлено …», Toast. LENGTH_SHORT).show();

4. Удалите вызов sendMail () и посмотрите, получите ли вы всплывающее окно.

5. Да. Это работает. итак, я думаю, что это проблема где-то в SendMail (), позвольте мне разобраться с этим и вернуться.

Ответ №2:

Нет необходимости вызывать runOnUiThread() из onPostExecute() . Этот метод уже выполняется в потоке пользовательского интерфейса.

Кроме того, это:

 @Override
protected void onPreExecute() 
{
    super.onPreExecute();
    finish();
}
  

выглядит странно. Вы завершаете действие перед запуском задачи, это правильно?

Комментарии:

1. Да. Это правильно. Я хочу закрыть экран сразу после того, как я вызвал асинхронность.

2. После вызова async doInBackground вызывается onPostExecute(), а не onPreExecute()

3. Да. Я знаю. Я не хочу показывать экран сразу после вызова async и, следовательно, я помещаю finish в preExecute

Ответ №3:

Нет необходимости писать runOnUiThread метод в post execute.

Попробуйте это

 protected class sendDetails extends AsyncTask<Context, Integer, Boolean>
{

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            Thread.sleep(1000);
            sendEmail();
        }
        catch (InterruptedException e) 
        {
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
       Toast.makeText(mContext, "Email Succesfully Sent...", Toast.LENGTH_SHORT).show();

    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        finish();
    }
}
  

Ответ №4:

Вы выполняете finishing активность в onPreExecute() , поэтому контекст этого текущего закрывается, поэтому toast не будет работать, сначала удалите этот cde.

AsyncTask будет работать следующим образом

Когда выполняется асинхронная задача, задачи выполняются следующим образом:

  1. onPreExecute(), вызываемый в потоке пользовательского интерфейса
  2. doInBackground(параметры …), вызываемый в фоновом потоке
  3. onProgressUpdate (прогресс …), вызываемый в потоке пользовательского интерфейса
  4. onPostExecute (результат), вызываемый в потоке пользовательского интерфейса

поэтому удалите finish из onPreExcute () и используйте его в onPostExcute (), если хотите, и еще одна вещь, которую не нужно запускать в потоке пользовательского интерфейса в методе postExecute().

Комментарии:

1. Хотел сказать, но все равно я не получаю тост.

Ответ №5:

Вот как я это делаю:

В классе, расширяющем Async, я создаю конструктор и передаю ему контекст вызывающего действия. Я выполняю некоторую задачу в фоновом режиме и возвращаю результат в виде строки. Возвращаемая строка указывает, была ли задача выполнена успешно или нет. Я создаю тост в onPostExecute (), и он отлично работает. Вот код для того же:

 public class TaskInBackground extends AsyncTask<Map<Integer,Object>, Void, String> {

Context context;

public TaskInBackground(Context context)
{
    this.context=context;
}

/**
 * task to be executed in the background
 */
@Override
@SuppressWarnings("unchecked")
protected String doInBackground(Map<Integer, Object>... params) {
    Map<Integer, Object> taskRequested=params[0];
       switch(taskRequested)
        case(1):
             return("Success");
        case(2):
             return("Success");
        default:
        return "Invalid";           
    }

}

/**
 * post execution of background task, what needs to be done
 */
protected void onPostExecute(String result)
{
    Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
}

}
  

Ответ №6:

попробуйте этот код

 public static void pushList(Activity context){
  static Context = mConext;

protected void onPostExecute(String result) {

      Toast toast=Toast.makeText(mConext,"Succefully Updated Profile",Toast.LENGTH_LONG);
             toast.show();

  }
}
  

этот код отлично работает для меня и отображает сообщение toast.