2013-06-13 2 views
0


@first Извините за мой плохой английский.
Я создал собственного слушателя. Я хочу изменить TextView, когда Listener вызывается в MainActivity из Сервиса. Идея моей Listener от:Собственное прослушивание изменений UI-Thread в Android

http://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/

В примере кода TriggerMethod() IST вызывается из расчета Thread, работает в службе. Я решил проблему, но считаю, что это не очень приятно, потому что в каждой новой операции я должен создать новый поток. Возможно ли создать интерфейс/прослушиватель, который автоматически может изменить пользовательский интерфейс?
Используется для решения проблемы:
http://developer.android.com/guide/components/processes-and-threads.html

ResultListener.java:

public interface ResultListener { 
    public void onResultAvailable(double result); 
} 

SimuService.java:

public class SimuService extends Service { 

    private ResultListener mResultListener = null; 

    public void setResultListener(ResultListener listener){ 
     mResultListener=listener; 
    } 
    public void triggerMethode(){ 
     observeResultDouble=getObserveDouble; 
     mResultListener.onResultAvailable(observeResultDouble);   
    } 

MainActivity:

public class MainActivity extends FragmentActivity{ 
    TextView txtView; 
    ResultListener mResultListener; 
    SimuService mSimuService; 

    protected void onCreate(Bundle savedInstanceState) { 
     txtView = (TextView) findViewById(R.id.txtServiceTime); 
     //Create Service .....an Bind 
     mResultListener = new ResultListener() {    
      @Override 
      public void onResultAvailable(double result) { 
       txtView.setText("Result: "+result); 
      } 
     }; 
     mSimuService.setResultListener(mResultListener); 

    } 

МОЕ РЕШЕНИЕ:

ResultListener = new ResultListener() {   
      @Override 
      public void onResultAvailable(double result) { 
       this.result=result; 
       runOnUiThread(setNewDataToUI); 
      } 
     }; 

private Thread setNewDataToUI = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     txtView.setText("Result: "+result); 

    } 
}); 

ответ

0

Прежде всего: Если вы ссылаетесь на службу в деятельности, служба становится довольно много бесполезной. Преимущество служб заключается в том, что они неразвязаны и могут работать независимо от действий (= то, что видит пользователь) и его жизненного цикла и даже могут быть в их собственном процессе. Таким образом, коммуникация с услугой-сервисом осуществляется посредством намерений или межпроцессного языка AIDL, а не через обратные вызовы. Если вы хотите что-то, выполненное асинхронно, используйте AsyncTask.

К вашей основной проблеме: как вы выяснили, вы можете изменять только пользовательский интерфейс в пользовательском интерфейсе. Таким образом, в соответствии с проектом, оставьте изменения пользовательского интерфейса в компоненте, то будет ответственно за это (либо activtiy или фрагмента), что предотвратит необходимость runOnUiThread()

Ваш код, кажется, как txtView.setText("Result: "+result); будет выполнена в деятельности, но он не будет. Он будет выполнен в Службе, который (как я раньше использовал) не запускается в UI-потоке. Проблема в том, что я не понимаю, чего именно вы хотите достичь, поэтому трудно дать вам альтернативное решение.

+0

ОК. Мне нужно изменить связь между Сервисом и Деятельностью. Я считаю, что эта ссылка решит мою проблему: http://stackoverflow.com/questions/4908267/communicate-with-activity-from-service-localservice-android-best-practices Спасибо за ваш ответ. – Tobias

Смежные вопросы