2011-06-13 20 views
0

我有一個MyService命名的類,它擴展了下面的Service。一切都會一直運行到 我刪除線程的run方法中的​​行。從Android的服務類的線程訪問活動中的UI組件

爲什麼?我怎樣才能從Thread類的run方法訪問Activity組件?

public class MyService extends Service { 

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

@Override 
public void onCreate() { 
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show(); 
    Log.d("Bilgi", "This msg will be shown."); 
    super.onCreate(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show(); 
    super.onStart(intent, startId); 

    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      try { 
       Log.d("This msg will ","be shown"); //if I remove next line 
       Toast.makeText(this, "This msg will NOT be shown", Toast.LENGTH_LONG).show(); 

       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, 5000, 8000); 
} 

回答

1

和我如何可以從Thread類的run方法訪問活動部件?

你不知道。使用MessengerMessage服務中的對象發送到活動的Handler。活動(僅限活動)可以更新其小部件,並且只能從主應用程序線程更新小部件。

Here is a sample application證明了這一點。

+0

能否通過[擴展binder類](https://developer.android.com/guide/components/bound-services.html#Binder)來使用綁定服務? Android文檔似乎暗示了當「您的服務僅僅是您自己的應用程序的後臺工作人員」時,使用'Messenger'的方法。 – AST 2016-07-26 13:38:32

+1

@AST:這將是另一種選擇,就像事件總線一樣。 – CommonsWare 2016-07-26 13:53:10

0

我所知道的唯一方法是使用廣播接收器的活動裏面,它捕捉任何你想要的信息並更新UI,或者你。

1

Don't use Threads - 使用AyncTasks。另外,您不應該通過線程/任務訪問Activity方法/ UI。看看第一個鏈接,瞭解活動及其「線程」如何協同工作。

0

在創建吐司,通過在ApplicationContext中,您可以通過getApplicationContext得到()

+0

您的意思是,從Activity傳遞上下文給MyService,並將其作爲Toa​​st.makeText(context.getApplicationContext(),「textextexte」,Toast.LENGTH_SHORT)參數傳遞給Context.getApplicationContext() .show();'? – uzay95 2011-06-13 16:04:31

+0

不,因爲Service是Context的擴展,所以您可以在Service中調用getApplicationContext(); Toast.makeText(getApplicationContext()) – 2011-06-13 16:15:10

+0

在MyService類的OnStart方法中,第一個Toast.makeText方法正在工作,但是'timer.scheduleAtFixedRate(new TimerTask(){ @Override public void run(){ try {Toast。 makeText ....... ' – uzay95 2011-06-13 17:34:33

0

的UI組件不是線程安全的所以你不能更新UI部件,除非在主(UI)線程,你的情況,使得Toast是在另一個線程這是被禁止的。

您可能需要使用類似Handler的東西,並使用Messenger將消息發送到在活動UI線程中創建的處理程序。然後在方法handleMessage(Message msg)中處理小部件。