1

我对 Android 编程很陌生,我现在有一个小问题。

我正在构建一个应该定期从西门子 PLC 中的数据库获取数据的应用程序。对于不同的数据类型,我在选项卡视图中有不同的选项卡。现在,我尝试仅在选项卡处于活动状态时更新每个选项卡的特定数据。现在我使用 onTabChanged 方法更新它们,每次更改一次。这工作正常。

现在我尝试了几种定期更新的解决方案(比如这个这个),但我无法让它工作。“最佳”解决方案是使用 wil(true) 语句,它使数据每 5 秒更新一次,但它没有更新 UI,也没有离开循环,除非我强制关闭应用程序。

就我得到正确答案而言,我的问题是,我想在我的主线程中更新 UI。我有一个从 PLC 读取数据的函数和一个将数据写入选项卡项目的函数。读取函数需要从“登录活动”作为 Intent 传递的类中的数据,因此我可以在调用 Intent 之前调用它,该 Intent 位于包含 tabview 的活动的 oncreate 方法中。

只要选项卡处于活动状态,是否有可能执行代码行,这些代码行现在在 ontabchanged 中运行良好,每 5 秒一次?如前所述,我有一个读取需要从意图移交的类文件的函数,以及一个写入数据的函数。它看起来像这样的自动取款机:

Bundle data = getIntent().getExtras();
final Login_Data logindata = data.getParcelable("logindata");
tabHost.setOnTabChangedListener(new OnTabChangeListener() {

    @Override
    public void onTabChanged(String tabId) {

        if (tabId == "Anzeige1") {
            Anzeigedatenlesen(logindata);
            Anzeigeschreiben();                             
        } else if (tabId == "Anzeige2") {
            System.out.println("Anzeige2"); 
        } else if (tabId == "Anzeige3") {
            System.out.println("Anzeige2");
        }
    }
});
4

1 回答 1

0

您链接到的答案中的代码应该可以满足您的需求,请参见下面的代码:

Bundle data = getIntent().getExtras();
final Login_Data logindata = data.getParcelable("logindata");
Handler mHandler = new Handler();
Runnable mRefresh = new Runnable() {

    @Override
    public void run() {
       // I guess this are the update methods?
       Anzeigedatenlesen(logindata);
       Anzeigeschreiben();
       mHandler.postDelayed(mRefresh, 5000);
    }   
};
tabHost.setOnTabChangedListener(new OnTabChangeListener() {

@Override
public void onTabChanged(String tabId) {

    if (tabId.equals("Anzeige1")) {
        // cancel any pending refresh that might be run in the near future 
        // as we got to our target tab and we need to refresh now!!!
        mHandler.removeCallbacks(mRefresh);
        // do a normal refresh
        Anzeigedatenlesen(logindata);
        Anzeigeschreiben();   
        // post a new refresh cycle as the user might stay on this tab                          
        mHandler.postDelayed(mRefresh, 5000);
    } else if (tabId.equals("Anzeige2")) {
        // for the other two tabs cancel the update if you get to them
        System.out.println("Anzeige2"); 
        mHandler.removeCallbacks(mRefresh);
    } else if (tabId.equals"Anzeige3")) {
        System.out.println("Anzeige2");
        mHandler.removeCallbacks(mRefresh);
    }
}
});

此外,您应该使用.equals()来测试字符串。

于 2013-03-20T10:31:25.827 回答