2013-05-09 45 views
3

我創建了一個服務類,現在我試圖在此類中運行新線程。服務在我的MainActivity開始,這很好。 onCreate()部分中的第一個Toast.Message顯示,但我的線程runa()中的消息沒有出現。認爲它應該與新的Runnable()一起工作。Android在服務類中創建新線程

public class My Service extends Service { 
    private static final String TAG = "MyService"; 
    Thread readthread; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); //is shown 

     readthread = new Thread(new Runnable() { public void run() { try { 
      runa(); 
     } catch (Exception e) { 
      //TODO Auto-generated catch block 
      e.printStackTrace(); 
     } } }); 

     readthread.start(); 

     Log.d(TAG, "onCreate"); 


    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 

    } 

    @Override 
    public void onStart(Intent intent, int startid) { 

     //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 

     //Log.d(TAG, "onStart"); 

    } 
    public void runa() throws Exception{ 

     Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); //doesn't show up 

    } 
} 

將是很好,如果有人可以幫助我:)

+1

你有什麼異常嗎?我猜''線程'在背景'線程'上執行,你不能顯示吐司。 – 2013-05-09 10:42:27

+2

@OvidiuLatcu你的評論是對他問題的回答。將它作爲答案移動,請 – Blackbelt 2013-05-09 10:43:42

+0

好的,謝謝,有沒有解決方法? – user2295158 2013-05-09 10:50:56

回答

5

您正在創建的Thread將不會在MainThread上執行,因此您無法在其中顯示Toast。要從後臺Thread顯示Toast,您將必須使用Handler,並使用該Handler來顯示Toast

private MyService extends Service { 
    Handler mHandler=new Handler(); 
    //... 

    public void runa() throws Exception{ 
     mHandler.post(new Runnable(){ 
      public void run(){ 
       Toast.makeText(MyService.this, "test", Toast.LENGTH_LONG).show() 
      } 
     } 
    }  
} 

這將是您的具體問題的解決方案,雖然我不認爲這是一個很好的「架構」或實踐,我不知道你要實現什麼。

+0

將'this'傳遞給Toast將無法使用! – 2013-05-09 11:06:54

+0

我編輯了回覆。 – 2013-05-09 11:13:24

+0

不錯,這個作品非常好!謝謝! – user2295158 2013-05-09 12:41:08

0

你不能表現出非UI線程的祝酒詞。您的服務正在主線程上運行,但您正在後臺線程中運行您的runa()方法。您必須使用處理程序並要求它在UI線程上顯示敬酒。請參閱this answer以瞭解如何完成此操作。

+0

確定這看起來不錯,但我不知道如何通過'MainThread'上運行的'服務'的上下文 – user2295158 2013-05-09 10:53:56

+2

。 'IntentService'在後臺線程上運行。 – 2013-05-09 10:56:34

+0

默認情況下,服務在[Main Thread](http://developer.android.com/reference/android/app/Service.html)上運行,因此您應該創建一個單獨的Thread以使其在後臺運行。 – 2013-05-09 10:56:43

0

更新從一個線程的UI,最好的辦法是使用一個處理器或UIThread

試試這個代碼:並沒有忘記把服務到Manifest文件第一。

class CapturingSerivce extends Service { 
Handler mHandler=new Handler(); 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

public void runa() throws Exception{ 
     mHandler.post(new Runnable(){ 
      public void run(){ 

      } 
     }); 
    }  


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    return super.onStartCommand(intent, flags, startId); 
    } 
}