自己的监听器在Android中更改UI-Thread

时间:2013-06-13 14:07:22

标签: java android


@first抱歉我的英语不好。
我创建了一个自己的监听器。我想在服务的MainActivity中调用Listener时更改TextView。我自己的听众的想法来自:

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

在代码示例中,TriggerMethod()是从在服务中运行的计算线程调用的。 我解决了问题,但我发现,这不是很好,因为在每个新的Activity中我都要创建一个新的Thread。是否可以创建一个可以自动更改UI的界面/监听器?
用于解决问题:
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);

    }
});

1 个答案:

答案 0 :(得分:0)

首先:如果您在活动中引用服务,则该服务变得毫无用处。服务的优点是,它们是松散耦合的,可以独立地形成活动(=用户看到的)及其生命周期,甚至可能在他们自己的过程中。因此,活动 - 服务通信是通过意图或进程间语言AIDL,而不是通过回调。如果你想要异步执行某些东西,请使用AsyncTask。

对于您的主要问题:正如您所发现的那样,您只能修改UI线程上的UI。因此,通过设计,在组件中保留更改UI,负责任地(活动或片段),这将阻止runOnUiThread()

的需要

您的代码似乎会在Activity中执行txtView.setText("Result: "+result);,但它不会。它将在Service中执行,它(如我之前实现的)不在UI线程上运行。问题是,我没有意图,你想要实现什么,所以很难给你一个替代解决方案。