在执行网络进程时无法在未调用 Looper.prepare() 的线程内创建处理程序



我正在尝试在我的应用程序后台运行网络进程以发送电子邮件。由于这是一个网络任务,因此必须在后台的单独线程上运行。但是,我无法让线程正确执行。要启动一个新线程,我只需创建一个,并使用 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())。

最新更新