1

ビューとタイマーを作成する非常に単純な Android アクティビティがあります。タイマー タスクは、「setTextColor」を呼び出して UI を更新します。実行すると、「setTextColor」の呼び出しが原因で、「java.util.concurrent.CopyOnWriteArrayList」によってメモリが割り当てられていることがわかります。これを回避する方法はありますか?私の意図は、消費されたメモリを変更せずにメモリを監視するこの単純なタイマーを実行することです。

アクティビティは次のとおりです。

public class AndroidTestActivity extends Activity
{
    Runnable updateUIRunnable;  // The Runnable object executed on the UI thread.
    long previousHeapFreeSize;  // Heap size last time the timer task executed.
    TextView text;              // Some text do display.

    // The timer task that executes the Runnable on the UI thread that updates the UI.
    class UpdateTimerTask extends TimerTask
    {
        @Override
        public void run()
        {
            runOnUiThread(updateUIRunnable);
        }       
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        // Super.
        super.onCreate(savedInstanceState);

        // Create the Runnable that will run on and update the UI.
        updateUIRunnable = new Runnable()
        {
            @Override
            public void run()
            {
                // Set the text color depending on the change in the free memory.
                long heapFreeSize = Runtime.getRuntime().freeMemory();
                if (previousHeapFreeSize != heapFreeSize)
                {
                    text.setTextColor(0xFFFF0000);
                }
                else
                {
                    text.setTextColor(0xFF00FF00);                  
                }
                previousHeapFreeSize = heapFreeSize;
            }           
        };

        // Create a frame layout to hold a text view.
        FrameLayout frameLayout = new FrameLayout(this);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        frameLayout.setLayoutParams(layoutParams);

        // Create and add the text to the frame layout. 
        text = new TextView(this);
        text.setGravity(Gravity.TOP | Gravity.LEFT);
        text.setText("Text");           
        frameLayout.addView(text);

        // Set the content view to the frame layout.    
        setContentView(frameLayout);

        // Start the update timer.
        UpdateTimerTask timerTask = new UpdateTimerTask();
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(timerTask, 500, 500);     
    }
}
4

3 に答える 3

0

問題の解決策を見つけました。表示されるテキストの色を更新すると、24 バイトのメモリ割り当てが発生していました。これを調整することで、テキストの色が更新されたときだけ、メモリの消費量が安定していることを確認できました。

于 2012-04-10T20:12:19.443 に答える
0

Android http://developer.android.com/reference/android/widget/Chronometer.htmlで組み込みの Chronometer クラスを使用できます。

自分でコーディングするよりもはるかに簡単

于 2012-04-10T00:45:24.730 に答える
0

メモリ リークに関する Romainguy からの素敵な投稿があります。

メモリリークの回避

于 2012-04-10T01:40:16.660 に答える