在Android中的onPostExecute()中吐司

时间:2014-07-04 03:41:22

标签: android android-asynctask

我正在尝试在Async中的OnPostExecture中发布一个Toast。

这是我所做的,但它没有记录,也没有烘烤。

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

两者都不起作用。如何从Async敬酒..有人可以帮我解决这个问题吗?

更新

根据JDJ改编,matiash&amp; RajaReddy PolamReddy

删除Finish();在onPreExecute中。 并在OnPostExecute中添加了以下内容:

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

谢谢!

6 个答案:

答案 0 :(得分:5)

您不必在runOnUiThread()中调用onPostExecute() ...此时它已经在UI线程上。

所以你的onPostExecute()应该是这样的:

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

在后台线程启动之前,通过finish() onPreExecute()中的活动,在后台线程完成后调用onPostExecute(),onPostExecute()中的mContext就是你的传入Toast构造函数可能甚至不再有效。

答案 1 :(得分:3)

没有必要从runOnUiThread()致电onPostExecute()。该方法已经在UI线程上运行。

另外,这个:

@Override
protected void onPreExecute() 
{
    super.onPreExecute();
    finish();
}
看起来很奇怪。您在启动任务之前完成了活动,这是正确的吗?

答案 2 :(得分:2)

finishing中您有onPreExecute()个活动,因此该当前的上下文正在关闭,因此toast将无效,请先删除该cde。

AsyncTask将像这样工作

执行异步任务时,任务的流程如下:

  1. onPreExecute(),在UI线程上调用
  2. doInBackground(Params ...),在后台线程上调用
  3. onProgressUpdate(Progress ...),在UI线程上调用
  4. onPostExecute(Result),在UI线程上调用
  5. 所以从onPreExcute()中删除finish,如果你愿意,可以在onPostExcute()中使用它,还有一件事不需要在postExecute()方法中的Ui线程上运行。

答案 3 :(得分:2)

无需在后执行中编写runOnUiThread方法。

试试这个

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 :(得分:0)

我是这样做的:

在扩展Async的类中,我创建了一个构造函数并将调用活动的上下文传递给它。我在后台执行一些任务并将结果作为字符串返回。返回的字符串表示任务是否成功执行。我在onPostExecute()中创建了toast,它工作正常。以下是相同的代码:

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

}

答案 5 :(得分:0)

试试这段代码

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 msg。