我正在尝试在我的应用程序后台运行网络进程以发送电子邮件。由于这是一个网络任务,因此必须在后台的单独线程上运行。但是,我无法让线程正确执行。要启动一个新线程,我只需创建一个,并使用 Thread.start() 运行它,
new Thread(){
public void run(){
Mail mail = new Mail();
mail.setFrom("someone@example.com");
mail.setTo("someone@to.com");
mail.setSubject("Hello");
mail.setMessage("World");
try
{
if (mail.send())
{
Toast.makeText(getActivity(),
"Email Sent Successfully", Toast.LENGTH_LONG)
.show();
}
else
Toast.makeText(getActivity(),
"Email Not Sent", Toast.LENGTH_LONG).show();
}
catch (Exception e)
{
Log.i("Debug","Could not send email - " + e);
Log.i("Debug",e.getStackTrace().toString());
}
}
}.start();
但是,我总是收到错误 无法在未调用 Looper.prepare() 的线程中创建处理程序
我尝试了其他一些事情,试图通过具有 Runnable 的处理程序将Looper.getMainLooper()
传递给线程,但它给了我同样的错误。我也尝试使用AsyncTask,但似乎由于这不是UI操作,因此使用AsyncTask是不正确的(另外,它也给了我同样的错误)。
这是我的堆栈跟踪
03-01 16:14:43.305: I/GreenBook(4454): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-01 16:14:43.305: I/GreenBook(4454): at android.os.Handler.<init>(Handler.java:121)
03-01 16:14:43.305: I/GreenBook(4454): at android.widget.Toast$TN.<init>(Toast.java:361)
03-01 16:14:43.305: I/GreenBook(4454): at android.widget.Toast.<init>(Toast.java:97)
03-01 16:14:43.305: I/GreenBook(4454): at android.widget.Toast.makeText(Toast.java:254)
03-01 16:14:43.305: I/GreenBook(4454): at com.stacksmashers.greenbook.RegisterActivity$10.run(RegisterActivity.java:688)
无法在未调用 Looper.prepare() 的线程中创建处理程序
那是因为您正在尝试显示Toast
。
我也尝试使用AsyncTask,但似乎由于这不是UI操作,因此使用AsyncTask不正确
大多数开发人员会将Toast
视为 UI 的一部分。
另外,它也给了我同样的错误
也许您正在尝试展示doInBackground()
Toast
.以onPostExecute()
显示您的Toast
(如果您选择呼叫publishProgress()
,则onProgressUpdate()
)。