1

私はAndroidプログラミングにまったく慣れていないので、今少し問題があります。

Siemens PLC の DB から定期的にデータを取得するアプリを構築しています。さまざまなデータ型に対して、タブ ビューにさまざまなタブがあります。タブがアクティブな場合にのみ、タブごとに特定のデータを更新しようとしました。今のところ、変更ごとに 1 回、onTabChanged メソッドでそれらを更新します。これはうまくいきます。

今、定期的に更新するためのいくつかのソリューション(thisまたはthisなど)を試しましたが、うまくいきませんでした。「最良の」解決策は、Whil(true) ステートメントを使用したもので、データが 5 秒ごとに更新されましたが、アプリを強制的にシャットダウンした場合を除いて、UI を更新せず、ループを離れませんでした。

答えが正しい限り、私の問題は、メインスレッドでUIを更新したいということです。PLC からデータを読み取る関数と、タブの項目にデータを書き込む関数があります。読み取り関数は、「loginactivity」からインテントとして渡されるクラスからのデータを必要とするため、タブビューを含むアクティビティの oncreate メソッドにあるインテントが呼び出されるまで呼び出すことができません。

タブがアクティブである限り、現在 ontabchanged で正常に動作するコード行を 5 秒ごとに実行する可能性はありますか? 前に述べたように、インテントから渡されたクラス ファイルを必要とする読み取り関数と、データを書き込む関数が 1 つあります。このatmのように見えます:

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 に答える