首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android中自己的监听器更改UI-Thread

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

Stack Overflow用户
提问于 2013-06-13 22:07:22
回答 1查看 913关注 0票数 0

@首先,为我糟糕的英语道歉。

我已经创建了一个自己的监听器。当从服务在MainActivity中调用侦听器时,我想要更改TextView。我自己的听众的想法来自于:

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

在代码示例中,TriggerMethod()是从在服务中运行的计算线程调用的。我解决了这个问题,但我发现,这并不是很好,因为在每一个新的活动中,我都必须创建一个新的线程。是否可以创建一个可以自动更改UI的接口/侦听器?

用于解决问题:

http://developer.android.com/guide/components/processes-and-threads.html

ResultListener.java:

代码语言:javascript
复制
public interface ResultListener {   
    public void onResultAvailable(double result);
}

SimuService.java:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);

    }

我的解决方案是:

代码语言:javascript
复制
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);

    }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-13 23:20:50

首先:如果你在一个活动中引用了一个服务,这个服务就会变得非常无用。服务的优势在于,它们是松耦合的,可以独立地形成活动(=用户看到的内容)及其生命周期,甚至可以在自己的流程中工作。因此,活动-服务通信是通过意图或进程间语言AIDL进行的,而不是通过回调。如果您希望异步执行某项操作,请使用AsyncTask。

对于您的主要问题:正如您所发现的,您只能在UI-thread上修改UI。因此,通过设计,在组件中保留更改UI,这是负责任的(无论是活动的还是片段的),这将防止需要runOnUiThread()

您的代码似乎将在活动中执行txtView.setText("Result: "+result);,但事实并非如此。它将在服务中执行,该服务(如我之前所暗示的)不在UI线程上运行。问题是,我不知道你到底想要达到什么目的,所以很难给你一个替代的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17089185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档