需要帮助修复我的类:'此Handler类应该是静态的或可能发生泄漏'

时间:2012-08-30 11:11:46

标签: android

我创建了一个简单的crossfade图像类,可以在我的应用中使用。但是......我有一个错误,由于缺乏知识,我无法解决。我发现这篇文章This Handler class should be static or leaks might occur: IncomingHandler,但我不知道如何解决这个问题。这是一个非常简单的课程。创建,初始化并开始使用它。

我希望有人可以帮我修复此警告,当我们处理此问题时,我的代码或评论的一些提示和提示也非常受欢迎;)

MainActivity.java

package com.example.crossfadeimage;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    Xfade xfade = new Xfade();

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

        // INIT(current activity, image id's, time between fades, fade speed)
        xfade.init(this, new int[]{ R.id.image1, R.id.image2, R.id.image3 }, 3000, 500);
        xfade.start();

    }

}

Xfade.java

package com.example.crossfadeimage;

import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;

public class Xfade {

    private Activity activity;

    // Handler
    private Handler handlerTimer = new Handler();
    private static final int UPDATE_STUFF_ON_DIALOG = 999;
    private int updateTime;

    private Animation fadeIn;
    private Animation fadeOut;

    public int[] xfadeImages;

    public int xfadeCounter = 1;

    public void init(Activity thisActivity, int[] images, int time,
            int animationSpeed) {

        activity = thisActivity;
        xfadeImages = images;
        updateTime = time;

        // Set Animations
        fadeIn = new AlphaAnimation(0, 1);
        fadeIn.setDuration(animationSpeed);

        fadeOut = new AlphaAnimation(1, 0);
        fadeOut.setDuration(animationSpeed);

        // Hide all images except the first
        // which is always visible
        for (int image = 1; image < xfadeImages.length; image++) {

            ImageView thisImage = (ImageView) activity
                    .findViewById(xfadeImages[image]);
            thisImage.setVisibility(4);

        }

    }

    public void start() {

        handlerTimer.removeCallbacks(taskUpdateStuffOnDialog);
        handlerTimer.postDelayed(taskUpdateStuffOnDialog, updateTime);

    }

    private Runnable taskUpdateStuffOnDialog = new Runnable() {
        public void run() {

            Message msg = new Message();
            msg.what = UPDATE_STUFF_ON_DIALOG;
            handlerEvent.sendMessage(msg);

            // Repeat this after 'updateTime'
            handlerTimer.postDelayed(this, updateTime);
        }
    };

    private Handler handlerEvent = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case UPDATE_STUFF_ON_DIALOG: {
                crossFade();
            }
                break;
            default: {
                super.handleMessage(msg);
            }
                break;
            }
        }
    };

    public void crossFade() {

        if (xfadeCounter == 0) {
            ImageView lastImage = (ImageView) activity
                    .findViewById(xfadeImages[xfadeImages.length - 1]);
            lastImage.setVisibility(4);
        }

        if (xfadeCounter < xfadeImages.length) {

            ImageView thisImage = (ImageView) activity
                    .findViewById(xfadeImages[xfadeCounter]);
            thisImage.setVisibility(0);
            thisImage.startAnimation(fadeIn);

            xfadeCounter++;

        } else {

            // Hide all images except the first
            // before fading out the last image
            for (int image = 1; image < xfadeImages.length; image++) {

                ImageView thisImage = (ImageView) activity
                        .findViewById(xfadeImages[image]);
                thisImage.setVisibility(4);

            }

            // Fadeout
            ImageView lastImage = (ImageView) activity
                    .findViewById(xfadeImages[xfadeImages.length - 1]);
            lastImage.startAnimation(fadeOut);

            // LastImage is faded to alpha 0 so it doesn't have to be hidden
            // anymore
            xfadeCounter = 1;

        }

    }

}

1 个答案:

答案 0 :(得分:3)

这允许您修改视图并将处理程序设置为静态。

package com.testing.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity implements Runnable {

    private static final int THREAD_RESULT = 1000;

    private TextView mTextView;

    private static Handler mHandler;

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

        mTextView = (TextView) findViewById(R.id.text);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mHandler = new CustomHandler(this);
        new Thread(this).start();
    }

    @Override
    public void run() {

        // Do some threaded work

        // Tell the handler the thread is finished
        mHandler.post(new Runnable() {

            @Override
            public void run() {
                mHandler.sendEmptyMessage(THREAD_RESULT);
            }
        });
    }

    private class CustomHandler extends Handler {

        private MainActivity activity;

        public CustomHandler(MainActivity activity) {
            super();
            this.activity = activity;
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case THREAD_RESULT:
                activity.mTextView.setText("Success!");
                break;
            }
        }

    }

}