#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 будет работать следующим образом
Когда выполняется асинхронная задача, задачи выполняются следующим образом:
- onPreExecute(), вызываемый в потоке пользовательского интерфейса
- doInBackground(параметры …), вызываемый в фоновом потоке
- onProgressUpdate (прогресс …), вызываемый в потоке пользовательского интерфейса
- 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.