2014-03-01 27 views
0

我試圖在我的應用程序的後臺運行聯網進程以發送電子郵件。由於這是一項網絡任務,因此必須在後臺的單獨線程中運行。但是,我無法讓線程正確執行。要開始一個新的線程,我只是創建一個,並使用Thread.start()運行它,無法在執行網絡程序時未調用Looper.prepare()的線程內創建處理程序

new Thread(){ 


     public void run(){ 
          Mail mail = new Mail(); 
      mail.setFrom("[email protected]"); 
      mail.setTo("[email protected]"); 
      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 ()

我嘗試了一些其他的事情,試圖通過Looper.getMainLooper()線程,通過處理程序與Runnable,但它給了我同樣的錯誤。我也嘗試過使用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) 
+0

請張貼您的堆棧跟蹤。 – CommonsWare

+0

現在在我的問題。 – iamseiko

+0

您應該提供**完整**堆棧跟蹤。 – nKn

回答

1

無法創建內螺紋()

處理程序尚未調用Looper.prepare那是因爲你正試圖顯示Toast

我也曾嘗試使用的AsyncTask但似乎因爲這不是一個UI操作,使用的AsyncTask是不正確

一個Toast會被大多數開發商認爲是用戶界面的一部分。

加,這也給了我同樣的錯誤

也許你正試圖從顯示的doInBackground()Toast。在onPostExecute()(或onProgressUpdate(),如果您選擇致電publishProgress())顯示Toast

+0

謝謝!這解決了問題!我沒有意識到我在用我的方法使用UI。作爲Async任務的一部分,我只是在OnProgressUpdate方法中調用Toast。 – iamseiko

+0

檢查這個庫'compile'c​​om.shamanland:xdroid-toaster:0.0.5'',它不需要'runOnUiThread()'或'Context'變量,所有例程都不見了!只需調用'Toaster.toast(R.string.my_msg);'這裏是例子:https://github.com/shamanland/xdroid-toaster-example –

相關問題