1

私はAndroid2.3.3を使用しています。画面を回転させた後、アクティビティのビューを更新するのに問題があります。

私のアクティビティには、変数(カウンター)、TextView(カウンター値を表示)、ボタン(カウンターを増やして表示)、TimerTask(カウンターを増やして表示)があります。正しく動作します。私のTextViewは、ButtonまたはTimerTaskからの各イベントの後に新しい値を表示します。

電話を回転させるまで機能します。TimerTaskのイベントが更新されなくなりました。ボタンと回転画面でビューを変更できます。私のTimerTaskはまだ変数を増やしますが、画面に変更はありません。確認したところ、TimerTaskはまだ実行および実行されています。

それは私の本当のプロジェクトではなく、私のバグがある部分にすぎません。

私の唯一の活動:

package com.test;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class TestRefreshActivity extends Activity {
    static TimerTask mTimerTask=null;
    static Timer t=new Timer();
    final Handler handler = new Handler();
    static int counter=0;

    //-------------------------------------------------
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //create and run the timer
        if(mTimerTask==null){
            Log.d("Test","new TimerTask");
            mTimerTask = new TimerTask() {
                public void run() {
                    handler.post(new Runnable(){
                        public void run(){
                            counter++;
                            refreshCounter();
                            Log.d("TIMER", "TimerTask run");
                        }
                    });
                }
            };
            t.schedule(mTimerTask, 500, 3000); 
        }
        Log.d("Test","--onCreate--");
        refreshCounter();
    }

    //-------------------------------------------------
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        mTimerTask.cancel();
        TestRefreshActivity.this.finish();
    }
    //-------------------------------------------------
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Test","--onDestroy--");
    }

    //-------------------------------------------------
    public void onBtnClick(View view){
        counter++;
        refreshCounter();
    }

    //-------------------------------------------------
    //the only function which refreshes the TextView
    private void refreshCounter(){
        Runnable run = new Runnable(){
            public void run(){
                TextView textView = (TextView)findViewById(R.id.textView1);
                textView.setText("counter="+counter);
                textView.invalidate();
            }
        };
        synchronized(run){
            TestRefreshActivity.this.runOnUiThread(run);
        }
    }
}

そして私の唯一の見解:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onBtnClick"
        android:text="Button" />

</LinearLayout> 

回転後にTimerTaskがビューを変更できない理由がわかりません。私が知っていることは、回転はそれを再作成するための私の活動を破壊しますが、静的変数だけが生き残ります。

ご協力いただきありがとうございます。

よろしく、

4

2 に答える 2

0

android:configChanges="keyboardHidden|orientation"-ガイドラインによって推奨されていない貧弱なソリューションです。画面の回転を節約するだけですが、バックグラウンドでアクティビティがAndroidによって強制終了された後も、アプリは使用できなくなります。

あなたがしていることを見てください。静的タイマーへのハンドラーへの参照を提供します。スマートフォンを回転させると、アクティビティが再作成されます(つまり、1つが破棄され、もう1つが作成されます)。アクティビティは破棄されますが、静的メンバーは引き続き有効であり、無効なアクティビティのハンドラーへの参照を保持しています。

次に、新しいハンドラーを使用して新しいアクティビティが作成されますが、timertaskはこれについて何も知りません。

したがって、無効なハンドラーを更新する静的タイマーと、何もしないアクティビティがあります。

統計を削除し、現在のタイマー値をonSaveInstanceStateのバンドルに保存します。

または(さらに簡単に)TimerTaskでハンドラーのセッターを作成し、このチェックif(mTimerTask==null){を行ってそのタイマーがすでにインスタンス化されていることを確認したら、新しいハンドラーを設定して(mTimerTask.setHandler(yourActivityHandler))、新しいアクティビティが作成されたときにタイマータスクが投稿するようにします新しいハンドラーで。

于 2012-06-25T09:47:13.090 に答える
-2

Androidマニフェストファイルを開き、Activityタグを次のように変更します

 <activity android:name=".aaa"
                  android:configChanges="keyboardHidden|orientation"
                  android:label="@string/app_name"></activity>
于 2012-06-25T09:36:49.530 に答える