簡體   English   中英

在Android中的onPostExecute()中吐司

[英]Toast in onPostExecute() in android

我試圖在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和RajaReddy PolamReddy改變

remove Finish(); 在onPreExecute中。 並在OnPostExecute中添加以下內容:

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

謝謝!

您不必在onPostExecute()調用runOnUiThread() ...此時它已經在UI線程上。

所以你的onPostExecute()應該是這樣的:

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

finish()的后台線程開始之前,荷蘭國際集團在onPreExecute()的活動,后台線程完成和onPostExecute()被調用后, mContext ()您傳遞到吐司構造函數onPostExecute甚至可能不有效了。

這是沒有必要調用runOnUiThread()onPostExecute() 該方法已在UI線程上運行。

這個:

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

看起來很奇怪 你在啟動任務之前完成了活動,這是正確的嗎?

您正在onPreExecute()finishing活動,因此該當前的上下文正在關閉,因此toast將無效,請先刪除該cde。

AsyncTask將像這樣工作

執行異步任務時,任務流如下:

  1. onPreExecute(),在UI線程上調用
  2. doInBackground(Params ...),在后台線程上調用
  3. onProgressUpdate(Progress ...),在UI線程上調用
  4. onPostExecute(Result),在UI線程上調用

所以從onPreExcute()中刪除finish並在onPostExcute()中使用它,如果你想要的話,還有一件事不需要在postExecute()方法中的Ui線程上運行。

無需在后執行中編寫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();
    }
}

我是這樣做的:

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

}

試試這段代碼

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM