5

I have a very simple code:

package com.example.conn08;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity
{
    private static CustomHandler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        updateUI();
    }
    private class CustomHandler extends Handler
    {
        @Override  
        public void handleMessage(Message msg) 
        {  
            MainActivity.this.updateUI();  
        }  
        public void sleep(long delayMillis)
        {  
            this.removeMessages(0);  
            sendMessageDelayed(obtainMessage(0), delayMillis);  
        }  
    }
    private void updateUI()
    {
        mHandler.sleep(1000);
        Log.v("updateUI", "kokoko");
    }
}

But in

MainActivity.this.updateUI();

I see

This Handler class should be static or leaks might occur (com.example.conn08.MainActivity.CustomHandler)

Why? help please


Edited code:

package com.example.conn08;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        updateUI();
    }
    static class CustomHandler extends Handler
    {
        WeakReference<MainActivity> mActivity;

        CustomHandler(MainActivity aFragment) 
        {
            mActivity = new WeakReference<MainActivity>(aFragment);
        }
        @Override
        public void handleMessage(Message message) 
        {
            MainActivity theActivity = mActivity.get();
            theActivity.this.updateUI();  
        }
    }
    private CustomHandler mHandler = new CustomHandler(this);

    private void updateUI()
    {
        //mHandler.sleep(1000);
        Log.v("updateUI", "kokoko");
    }

}

I have edited it like in example here Handlers and memory leaks in Android, but now I have "theActivity cannot be resolved to a type"

Community
  • 1
  • 1
Leo
  • 3,003
  • 5
  • 38
  • 61
  • 1
    drop the `theActivity.this` and just use `theActivity`. It's a `Reference` to your `theActivity.this`, so it's double. – tolgap Nov 10 '12 at 12:47
  • Possible duplicate of [This Handler class should be static or leaks might occur: IncomingHandler](https://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler) – SebasSBM Nov 13 '18 at 11:06

1 Answers1

0

Change:

theActivity.this.updateUI();  

to:

theActivity.updateUI();  

because when you say theActivity, it is like saying this.

B770
  • 1,272
  • 3
  • 17
  • 34
MIWMIB
  • 1,407
  • 1
  • 14
  • 24