2013-05-19 16 views
0

Android:在服務中的timertask中更新GUI

你好社區,

我已經看了關於我的問題的論壇,但我不知道如何使用的處理程序。

我的問題:
GUI有一個文本框。我創建了一個服務,它的工作原理。該服務應更新UI。

我有什麼:

  • 的Android的Galaxy S手持
  • 靛藍服務發佈2

我的編碼:

public class SamsungLoc1 extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_samsung_loc1); 

    buttonStart = (Button) findViewById(R.id.buttonStart); 
     buttonStop = (Button) findViewById(R.id.buttonStop); 

     buttonStart.setOnClickListener(this); 
     buttonStop.setOnClickListener(this); 

     TextView tv1 = (TextView) findViewById(R.id.TextView01); 
     tv1.setText("initial1"); 
    } 

    public void onClick(View src) { 
     switch (src.getId()) { 
     case R.id.buttonStart: 
      startService(new Intent(this, MyService.class)); 
      break; 
     case R.id.buttonStop: 
      Log.d(TAG, "onClick: stopping srvice"); 
      break; 
     } 
     } 
} 

所以點擊開始按鈕時,該服務MyService.class啓動:

public class MyService extends Service { 
    private static final String TAG = "MyService"; 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public void onDestroy() { 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
      Timer t = new Timer(); 
      t.scheduleAtFixedRate(new TimerTask() { 
//    @Override 
       public void run() { 

//Here I would like to change the textview of the UI 

          tv1.setText("New Information"); 



       }      
      },0,300000);  
    } 
} 

那麼,我已經讀過,我必須使用處理程序,但我不知道如何使用它。可以請請請:-)給我一個代碼片斷如何更改服務的時間任務內的textview tv1?

請問候,
安迪

+0

你確實需要更新用戶界面的服務嗎? – twocity

回答

1

服務應更新UI

不,它不得。

服務應該做些什麼來讓應用的UI層知道發生在後臺的某些事件。請記住,如果用戶已按下BACK或HOME或其他東西,那麼可能不是應用程序的UI層。

而且,如果你對此的迴應是「好的,我將在這些情況下停止服務」,那麼你不需要服務,應該擺脫它。 後面的服務是爲了能夠獨立於UI層運行,用於純後臺工作。

服務MyService.class開始

onStart()已經被廢棄了大約四年。請學習現代 Android應用程序開發。使用onStartCommand(),而不是onStart()

我已經讀過,我必須使用一個處理器

雖然這是一個選項,它不會是我的第一選擇。或者我的第二選擇。或者我的第三選擇。

我個人的第一選擇是使用第三方消息總線,例如Otto。我沒有示例Otto應用程序,因爲我還沒有在我的書中介紹過這個應用程序(儘管它在我的待辦事項清單上很高)。

我的第二選擇是使用LocalBroadcastManagerLocalBroadcastManager的優勢在於它位於Android支持包中(您可能已經在使用),並且它與常規系統廣播(您可能已經有過的經驗)非常相似。 Here is a sample project使用LocalBroadcastManager

我的第三選擇是使用實際的系統廣播,如果您的服務呼叫sendBroadcast(),並且您的活動在前臺時已註冊BroadcastReceiver。如果您想更新某個活動(如果它位於前臺),則此功能非常有用,否則顯示Notification,如this sample app中所示。這對於允許第三方應用程序瞭解您的事件也很有用,前兩種解決方案排除了這些事件。

儘管可能會有場景直接使用Handler是個好主意,但我想不出任何與Android新手有關的情況。

+0

Hello CommonsWare,非常感謝您的回覆。所以我會看看LocalBroadcastManager或系統廣播。也感謝示例提示。我會試着去理解它:-)請問安迪 – user2365999