我正在尝试在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();
谢谢!
答案 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将像这样工作
执行异步任务时,任务的流程如下:
所以从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。