1

アプリで使用するための単純なクロスフェード画像クラスを作成しました。しかし...知識不足のために修正できないエラーがあります。この投稿を見つけました。このハンドラークラスは静的である必要があります。そうしないと、リークが発生する可能性があります。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;

        }

    }

}
4

1 に答える 1

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;
            }
        }

    }

}
于 2012-08-30T11:22:38.280 に答える