Android:处理程序在removeCallback()之后未停止

Android:处理程序在removeCallback()之后未停止,android,handler,Android,Handler,我需要在我的应用程序中实现幻灯片放映。为此,我使用了处理程序。当我单击“播放”按钮时,幻灯片放映开始,播放按钮变为“暂停”按钮。但当我再次单击以暂停幻灯片放映时,它从不暂停。尽管如此,我们仍在继续执行。 这是我的密码: public class GalleryImageFullscreen extends TIEBaseActivity implements OnClickListener { PrefStore lang_PrefStore; Resources res; Config

我需要在我的应用程序中实现幻灯片放映。为此,我使用了
处理程序
。当我单击“播放”按钮时,幻灯片放映开始,播放按钮变为“暂停”按钮。但当我再次单击以暂停幻灯片放映时,它从不暂停。尽管如此,我们仍在继续执行。
这是我的密码:

public class GalleryImageFullscreen extends TIEBaseActivity implements
    OnClickListener {
PrefStore lang_PrefStore;
Resources res;
Configuration config;
Locale mLocale = null;
String language;
boolean isLocaleChanged = false;
ViewPager imgViewPager;
ArrayList<String> imgUrlList;
private ImageLoader imageLoader;
private DisplayImageOptions options;
int position;
ImageButton btnPrev, btnPlay, btnNext;
public static final String TAG = "TIEGalleryFS";
boolean isPlaying;
Handler mHandler;
SwitchImage swImageRunnable;

protected void onCreate(Bundle savedInstanceState) {
    super.createDefaultView(savedInstanceState);

    _headerBar.view.setVisibility(View.VISIBLE);
    _footerBar.view.setVisibility(View.VISIBLE);

    imgUrlList = getIntent().getStringArrayListExtra(
            GalleryActivity.IMAGE_URL_LIST);
    Log.v(TAG, "IMAGE LIST SIZE = " + imgUrlList.size());

    position = getIntent().getIntExtra("POSITION", 0);
    Log.v(TAG, "IMAGE POSITION = " + position);

    mHandler = new Handler();
    swImageRunnable = new SwitchImage();
    super.setHeaderTitle(getResources().getString(R.string.gallery));

    res = getResources();

    lang_PrefStore = new PrefStore();
    language = lang_PrefStore.getLanguageChoice(
            GalleryImageFullscreen.this, FooterBar.LANG_SELECT);
    Log.v("GalleryImageFullscreen language choice", language);

    config = getBaseContext().getResources().getConfiguration();
    if (!language.equals("")
            && language.equals(config.locale.getLanguage())) {
        mLocale = new Locale(language);
        Locale.setDefault(mLocale);
        config.locale = mLocale;
        getBaseContext().getResources().updateConfiguration(config,
                getBaseContext().getResources().getDisplayMetrics());
        Log.v("GalleryImageFullscreen onCreate languageset", "in if loop");
    }

    init();

    imageLoader = ImageLoader.getInstance();
    imageLoader.init(ImageLoaderConfiguration
            .createDefault(GalleryImageFullscreen.this));

    options = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.image_for_empty_url)
            .showImageForEmptyUri(R.drawable.image_for_empty_url)
            .cacheInMemory().cacheOnDisc()
            .bitmapConfig(Bitmap.Config.RGB_565).build();
}// onCreate

private void init() {
    loadFormFromResource(R.layout.gallery_image_fullscreen);
    imgViewPager = (ViewPager) findViewById(R.id.imgpager);
    btnPrev = (ImageButton) findViewById(R.id.btnPrev);
    btnPlay = (ImageButton) findViewById(R.id.btnPlay);
    btnNext = (ImageButton) findViewById(R.id.btnNext);

    if ((imgUrlList != null) && (imgUrlList.size() > 0)) {
        imgViewPager.setAdapter(new ImagePagerAdapter(imgUrlList));
        imgViewPager.setCurrentItem(position);
    }

    btnPrev.setOnClickListener(this);
    btnPlay.setOnClickListener(this);
    btnNext.setOnClickListener(this);
}// init

public void onClick(View v) {
    if (v.equals(btnPrev)) {
        if (position != 0) {
            position--;
            imgViewPager.setCurrentItem(position, true);
        }
        Log.v(TAG, "PREV POSITION = " + position);
    }

    if (v.equals(btnPlay)) {
        if (!isPlaying) {
            Log.v(TAG, "in if isPlaying = " + isPlaying);
            runTimerTask();
            isPlaying = true;
            btnPlay.setBackgroundResource(R.drawable.btn_pause);
        } else {
            Log.v(TAG, "in else isPlaying = " + isPlaying);
            mHandler.removeCallbacks(swImageRunnable);
            isPlaying = false;
            btnPlay.setBackgroundResource(R.drawable.btn_play);
        }

    }

    if (v.equals(btnNext)) {
        if (position != (imgUrlList.size() - 1)) {
            position++;
            imgViewPager.setCurrentItem(position, true);
        }
        Log.v(TAG, "NEXT POSITION = " + position);
    }
}// onClick

private class ImagePagerAdapter extends PagerAdapter {

    private ArrayList<String> images;
    private LayoutInflater inflater;

    ImagePagerAdapter(ArrayList<String> images) {
        this.images = images;
        inflater = getLayoutInflater();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((View) object);
    }

    @Override
    public void finishUpdate(View container) {
    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public Object instantiateItem(ViewGroup view, int position) {
        View imageLayout = inflater.inflate(R.layout.item_pager_image,
                view, false);
        ImageView imageView = (ImageView) imageLayout
                .findViewById(R.id.image);
        final ProgressBar spinner = (ProgressBar) imageLayout
                .findViewById(R.id.loading);

        imageLoader.displayImage(images.get(position), imageView, options,
                new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        spinner.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        switch (failReason.getType()) {
                        case IO_ERROR:
                            break;
                        case DECODING_ERROR:
                            break;
                        case NETWORK_DENIED:
                            break;
                        case OUT_OF_MEMORY:
                            break;
                        case UNKNOWN:
                            break;
                        }
                        spinner.setVisibility(View.GONE);
                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        spinner.setVisibility(View.GONE);
                    }
                });

        ((ViewPager) view).addView(imageLayout, 0);
        return imageLayout;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void startUpdate(View container) {
    }
}

@Override
protected void onPause() {
    super.onPause();
    if (imageLoader != null) {
        imageLoader.stop();
    }
}

private void runTimerTask() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(3000);
                    mHandler.post(swImageRunnable);
                } catch (Exception e) {
                }
            }
        }
    }).start();
}// runTimerTask

private class SwitchImage implements Runnable {
    @Override
    public void run() {
        if (position != (imgUrlList.size() - 1)) {
            Log.v(TAG, "in runnable if");
            position++;
            imgViewPager.setCurrentItem(position, true);
        } else {
            Log.v(TAG, "in runnable else");
            //mHandler.removeCallbacks(swImageRunnable);
            btnPlay.setBackgroundResource(R.drawable.btn_play);
            isPlaying = false;
        }
    }
}
}// GalleryImageFullscreen
公共类GalleryImageFullscreen扩展TIEBaseActivity实现
onclick侦听器{
预存储lang_预存储;
资源和资源;
配置配置;
Locale mLocale=null;
字符串语言;
布尔值IsLocalChanged=false;
ViewPager imgViewPager;
ArrayList imgUrlList;
私有图像加载器;
私有显示图像选项;
内部位置;
图像按钮btnPrev、btnPlay、btnNext;
公共静态最终字符串TAG=“TIEGalleryFS”;
布尔显示;
汉德勒;
SwitchImage Swimagerunable;
创建时受保护的void(Bundle savedInstanceState){
super.createDefaultView(savedInstanceState);
_headerBar.view.setVisibility(视图.可见);
_footerBar.view.setVisibility(view.VISIBLE);
imgUrlList=getIntent().getStringArrayListExtra(
GalleryActivity.IMAGE\u URL\u列表);
Log.v(标记,“图像列表大小=“+imgurlist.SIZE());
位置=getIntent().getIntExtra(“位置”,0);
Log.v(标签,“图像位置=”+位置);
mHandler=新处理程序();
swimagerunable=newswitchimage();
setHeaderTitle(getResources().getString(R.string.gallery));
res=getResources();
lang_PrefStore=新的PrefStore();
language=lang\u PrefStore.getLanguageChoice(
GalleryImageFullscreen.this,FooterBar.LANG\u SELECT);
Log.v(“GalleryImage全屏语言选择”,语言);
config=getBaseContext().getResources().getConfiguration();
如果(!language.equals(“”)
&&language.equals(config.locale.getLanguage()){
mLocale=新区域设置(语言);
setDefault(mLocale);
config.locale=mLocale;
getBaseContext().getResources().updateConfiguration(配置、,
getBaseContext().getResources().getDisplayMetrics());
Log.v(“GalleryImageFullScreenOnCreate语言集”,“在if循环中”);
}
init();
imageLoader=imageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration
.createDefault(GalleryImageFullscreen.this));
选项=新建DisplayImageOptions.Builder()
.showStubImage(R.drawable.image\u表示\u空\u url)
.showImageForEmptyUri(R.drawable.image\u表示\u空\u url)
.cacheInMemory().cacheOnDisc()
.bitmapConfig(Bitmap.Config.RGB_565).build();
}//一次创建
私有void init(){
loadFormFromResource(R.layout.gallery\u image\u全屏);
imgViewPager=(ViewPager)findViewById(R.id.imgpager);
btnPrev=(图像按钮)findViewById(R.id.btnPrev);
btnPlay=(ImageButton)findViewById(R.id.btnPlay);
btnNext=(ImageButton)findViewById(R.id.btnNext);
if((imgurlist!=null)&&(imgurlist.size()>0)){
setAdapter(新的ImagePagerAdapter(imgurlist));
imgViewPager.setCurrentItem(位置);
}
btnPrev.setOnClickListener(此);
btnPlay.setOnClickListener(此);
btnNext.setOnClickListener(此);
}//初始化
公共void onClick(视图v){
如果(v.等于(btnPrev)){
如果(位置!=0){
位置--;
imgViewPager.setCurrentItem(位置,true);
}
Log.v(标签,“PREV POSITION=“+POSITION”);
}
如果(v.equals(btnPlay)){
如果(!显示){
Log.v(标签,“如果显示在屏幕上,则显示在屏幕上=”+isplay);
runTimerTask();
isplay=true;
btnPlay.setBackgroundResource(R.drawable.btn\u暂停);
}否则{
Log.v(标签“in-else isplay=“+isplay”);
mHandler.removeCallbacks(可切换);
isplay=false;
btnPlay.setBackgroundResource(R.drawable.btn_play);
}
}
如果(v.equals(btnNext)){
if(位置!=(imgurlist.size()-1)){
位置++;
imgViewPager.setCurrentItem(位置,true);
}
Log.v(标签,“下一个位置=”+位置);
}
}//onClick
私有类ImagePagerAdapter扩展了PagerAdapter{
私有数组列表图像;
私人充气机;
ImagePagerAdapter(ArrayList图像){
这个。图像=图像;
充气机=充气机();
}
@凌驾
公共项(视图组容器、int位置、对象){
((ViewPager)容器)。移除视图((视图)对象);
}
@凌驾
公共void finishUpdate(视图容器){
}
@凌驾
public int getCount(){
返回图像。size();
}
@凌驾
公共对象实例化项(视图组视图,int位置){
查看图像布局=充气机。充气(R.layout.item\u pager\u图像,
视图(错误);
ImageView ImageView=(ImageView)imageLayout
.findviewbyd(R.id.image);
最终ProgressBar微调器=(ProgressBar)图像布局
.findViewById(R.id.loading);
imageLoader.displayImage(images.get(位置)、imageView、选项、,
新的SimpleImageLoadingListener(){
@凌驾
public void onLoadingStarted(字符串imageUri,视图){
spinner.setVisibility(View.VISIBLE);
}
@凌驾
public void onload失败(字符串imageUri、视图、,
失效原因(失效原因){
开关(failReason.getType()){
案例IO_错误:
打破
案例解码错误:
打破
案件被驳回:
打破
大小写输出\u\u内存:
public class GalleryImageFullscreen extends TIEBaseActivity implements
    OnClickListener {
PrefStore lang_PrefStore;
Resources res;
Configuration config;
Locale mLocale = null;
String language;
boolean isLocaleChanged = false;
ViewPager imgViewPager;
ArrayList<String> imgUrlList;
private ImageLoader imageLoader;
private DisplayImageOptions options;
int position;
ImageButton btnPrev, btnPlay, btnNext;
public static final String TAG = "TIEGalleryFS";
volatile boolean isPlaying;
SwitchImage swImageRunnable;
MyTimerTask myTask;
Timer myTimer;

protected void onCreate(Bundle savedInstanceState) {
    super.createDefaultView(savedInstanceState);

    _headerBar.view.setVisibility(View.VISIBLE);
    _footerBar.view.setVisibility(View.VISIBLE);

    imgUrlList = getIntent().getStringArrayListExtra(
            GalleryActivity.IMAGE_URL_LIST);
    Log.v(TAG, "IMAGE LIST SIZE = " + imgUrlList.size());

    position = getIntent().getIntExtra("POSITION", 0);
    Log.v(TAG, "IMAGE POSITION = " + position);
    swImageRunnable = new SwitchImage();
    super.setHeaderTitle(getResources().getString(R.string.gallery));

    res = getResources();

    lang_PrefStore = new PrefStore();
    language = lang_PrefStore.getLanguageChoice(
            GalleryImageFullscreen.this, FooterBar.LANG_SELECT);
    Log.v("GalleryImageFullscreen language choice", language);

    config = getBaseContext().getResources().getConfiguration();
    if (!language.equals("")
            && language.equals(config.locale.getLanguage())) {
        mLocale = new Locale(language);
        Locale.setDefault(mLocale);
        config.locale = mLocale;
        getBaseContext().getResources().updateConfiguration(config,
                getBaseContext().getResources().getDisplayMetrics());
        Log.v("GalleryImageFullscreen onCreate languageset", "in if loop");
    }

    init();

    imageLoader = ImageLoader.getInstance();
    imageLoader.init(ImageLoaderConfiguration
            .createDefault(GalleryImageFullscreen.this));

    options = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.image_for_empty_url)
            .showImageForEmptyUri(R.drawable.image_for_empty_url)
            .cacheInMemory().cacheOnDisc()
            .bitmapConfig(Bitmap.Config.RGB_565).build();
}// onCreate

private void init() {
    loadFormFromResource(R.layout.gallery_image_fullscreen);
    imgViewPager = (ViewPager) findViewById(R.id.imgpager);
    btnPrev = (ImageButton) findViewById(R.id.btnPrev);
    btnPlay = (ImageButton) findViewById(R.id.btnPlay);
    btnNext = (ImageButton) findViewById(R.id.btnNext);

    if ((imgUrlList != null) && (imgUrlList.size() > 0)) {
        imgViewPager.setAdapter(new ImagePagerAdapter(imgUrlList));
        imgViewPager.setCurrentItem(position);
    }

    btnPrev.setOnClickListener(this);
    btnPlay.setOnClickListener(this);
    btnNext.setOnClickListener(this);
}// init

public void onClick(View v) {
    if (v.equals(btnPrev)) {
        if (position != 0) {
            position--;
            imgViewPager.setCurrentItem(position, true);
        }
        Log.v(TAG, "PREV POSITION = " + position);
    }

    if (v.equals(btnPlay)) {
        if (!isPlaying) {
            Log.v(TAG, "in if isPlaying = " + isPlaying);
            runTimerTask();
            isPlaying = true;
            btnPlay.setBackgroundResource(R.drawable.btn_pause);
        } else {
            Log.v(TAG, "in else isPlaying = " + isPlaying);
            isPlaying = false;
            myTask.cancel();
            myTimer.cancel();
            btnPlay.setBackgroundResource(R.drawable.btn_play);
        }

    }

    if (v.equals(btnNext)) {
        if (position != (imgUrlList.size() - 1)) {
            position++;
            imgViewPager.setCurrentItem(position, true);
        }
        Log.v(TAG, "NEXT POSITION = " + position);
    }
}// onClick

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.tie_options_menu, menu);
    return true;
}// onCreateOptionsMenu

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_Eng:
        lang_PrefStore.setLanguageChoice(GalleryImageFullscreen.this,
                FooterBar.LANG_SELECT, "en");
        mLocale = new Locale("en");
        Locale.setDefault(mLocale);
        config.locale = mLocale;
        getResources().updateConfiguration(config,
                getResources().getDisplayMetrics());
        isLocaleChanged = true;
        Toast.makeText(GalleryImageFullscreen.this, "English",
                Toast.LENGTH_SHORT).show();
        refreshActivity();
        break;

    case R.id.menu_German:
        lang_PrefStore.setLanguageChoice(GalleryImageFullscreen.this,
                FooterBar.LANG_SELECT, "de");
        mLocale = new Locale("de");
        Locale.setDefault(mLocale);
        config.locale = mLocale;
        getResources().updateConfiguration(config,
                getResources().getDisplayMetrics());
        isLocaleChanged = true;
        Toast.makeText(GalleryImageFullscreen.this, "German",
                Toast.LENGTH_SHORT).show();
        refreshActivity();
        break;

    case R.id.menu_Russian:
        lang_PrefStore.setLanguageChoice(GalleryImageFullscreen.this,
                FooterBar.LANG_SELECT, "ru");
        mLocale = new Locale("ru");
        Locale.setDefault(mLocale);
        config.locale = mLocale;
        getResources().updateConfiguration(config,
                getResources().getDisplayMetrics());
        isLocaleChanged = true;
        Toast.makeText(GalleryImageFullscreen.this, "Russian",
                Toast.LENGTH_SHORT).show();
        refreshActivity();
        break;
    }// switch
    return super.onOptionsItemSelected(item);
}// onOptionsItemSelected

private class ImagePagerAdapter extends PagerAdapter {

    private ArrayList<String> images;
    private LayoutInflater inflater;

    ImagePagerAdapter(ArrayList<String> images) {
        this.images = images;
        inflater = getLayoutInflater();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((View) object);
    }

    @Override
    public void finishUpdate(View container) {
    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public Object instantiateItem(ViewGroup view, int position) {
        View imageLayout = inflater.inflate(R.layout.item_pager_image,
                view, false);
        ImageView imageView = (ImageView) imageLayout
                .findViewById(R.id.image);
        final ProgressBar spinner = (ProgressBar) imageLayout
                .findViewById(R.id.loading);

        imageLoader.displayImage(images.get(position), imageView, options,
                new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        spinner.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        switch (failReason.getType()) {
                        case IO_ERROR:
                            break;
                        case DECODING_ERROR:
                            break;
                        case NETWORK_DENIED:
                            break;
                        case OUT_OF_MEMORY:
                            break;
                        case UNKNOWN:
                            break;
                        }
                        spinner.setVisibility(View.GONE);
                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        spinner.setVisibility(View.GONE);
                    }
                });

        ((ViewPager) view).addView(imageLayout, 0);
        return imageLayout;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void startUpdate(View container) {
    }
}

@Override
protected void onPause() {
    super.onPause();
    if (imageLoader != null) {
        imageLoader.stop();
    }
}

private void runTimerTask() {
    myTask = new MyTimerTask();
    myTimer = new Timer();
    myTimer.scheduleAtFixedRate(myTask, 0, 3000);
}// runTimerTask

private class SwitchImage implements Runnable {
    @Override
    public void run() {
        if (position != (imgUrlList.size() - 1)) {
            Log.v(TAG, "in runnable if");
            position++;
            imgViewPager.setCurrentItem(position, true);
        } else {
            Log.v(TAG, "in runnable else");
            btnPlay.setBackgroundResource(R.drawable.btn_play);
            isPlaying = false;
        }
    }// run
}// SwitchImage

class MyTimerTask extends TimerTask {
    final Handler mHandler = new Handler(Looper.getMainLooper());

    public void run() {
        mHandler.post(swImageRunnable);
    }// run
}// MyTimerTask

@Override
protected void onDestroy() {
    if(myTask != null) {
        myTask = null;
    }

    if(myTimer != null) {
        myTimer.purge();
    }
    super.onDestroy();
}
}// GalleryImageFullscreen