最近做了个android定时器来实现每隔一段时间来显示下一张图片
在代码中设置定时器时间是没问题的 
我加了个EditText,Button
在文本中输入数字,点击按钮
得到这个数字,再设置为定时的时间
第一次假设设为5秒没有问题,是每5秒显示下一张
然后再改成1秒也没问题,是每一秒显示下一张
但是再想改成其他数字还是每一秒显示下一张
做了下测试,就是下一次设置的数字不能比上一次大
否则,依然是上一次的定时时间

解决方案 »

  1.   

    package com.flysnow.image;import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.AnimationUtils;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.Gallery;
    import android.widget.ImageSwitcher;
    import android.widget.ImageView;
    import android.widget.ViewSwitcher;
    import android.widget.Gallery.LayoutParams;
    import android.view.View.OnClickListener;
    import java.util.Timer;
    import java.util.TimerTask;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.EditText;
    import java.lang.Integer;
    //import android.util.Log;public class Image extends Activity implements
    AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory{
        private ImageSwitcher mSwitcher;
        private EditText m_Text;
        private static int              m_nIndex           = 0;
        private static int              m_nTime           = 1;
        private Integer[] mThumbIds = {
                R.drawable.ic_launcher,R.drawable.j,R.drawable.k,R.drawable.l,
                R.drawable.m,R.drawable.n};    private Integer[] mImageIds = {
                R.drawable.ic_launcher,R.drawable.j,R.drawable.k,R.drawable.l,
                R.drawable.m,R.drawable.n};
        
        /** Called when the activity is first created. */
        private Timer m_Timer = new Timer();
        private Handler m_Handler = new Handler()
        {
         public void handleMessage(Message msg)
         {
         //Log.e("@@@",m_nIndex+"");
         if(mImageIds.length <= m_nIndex)
         {
         m_nIndex = 0;
         }
         mSwitcher.setImageResource(mImageIds[m_nIndex]);
         mSwitcher.invalidate();
         super.handleMessage(msg);
         }
        };
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);        mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
            mSwitcher.setFactory(this);
            mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
                    android.R.anim.fade_in));
            mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
                    android.R.anim.fade_out));        Gallery g = (Gallery) findViewById(R.id.gallery);
            ImageAdapter mAdapter = new ImageAdapter(this);
            g.setAdapter(mAdapter);
            g.setOnItemSelectedListener(this);
      
            Button BtnNext = (Button)findViewById(R.id.next); 
            BtnNext.setOnClickListener(new OnClickListener()
            {
             public void onClick(View v)
             {
             m_nIndex++;
             if(mThumbIds.length <= m_nIndex)
             {
             m_nIndex = 0;
             }
             mSwitcher.setImageResource(mImageIds[m_nIndex]);
             }
            });
            Button BtnForward = (Button)findViewById(R.id.forward); 
            BtnForward.setOnClickListener(new OnClickListener()
            {
             public void onClick(View v)
             {
             m_nIndex--;
             if(0 > m_nIndex)
             {
             m_nIndex = mThumbIds.length -1;
             }
             mSwitcher.setImageResource(mImageIds[m_nIndex]);
             }
            });
            m_Text = (EditText)findViewById(R.id.text);
            Button BtnSure = (Button)findViewById(R.id.sure);
            BtnSure.setOnClickListener(new OnClickListener()
            {
             public void onClick(View v)
             {
             String sText = m_Text.getText().toString();
             m_nTime = Integer.parseInt(sText);
                    m_Timer.scheduleAtFixedRate(new TimerTask()
                    {
                     public void run()
                     {
                     m_nIndex++;
                     Message msg = new Message();
                     msg.what = m_nIndex;
                     m_Handler.sendMessage(msg);
                     }
                    },0,m_nTime*1000);
             }
            });
        }
        protected void OnDestory()
        {
         m_Timer.cancel();
         m_nTime = 0;
         super.onDestroy();
        }
        /*
         *     
         * override for ViewSwitcher.ViewFactory#makeView()
         */
        public View makeView() {
            ImageView i = new ImageView(this);
            i.setBackgroundColor(0xFF000000);
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,
                    LayoutParams.FILL_PARENT));
            return i;
        }    /*
         * override for 
         * AdapterView.OnItemSelectedListener#onItemSelected()
         */
        public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 
            mSwitcher.setImageResource(mImageIds[position]);
            m_nIndex = position;
        }    /*
         * override for AdapterView.OnItemSelectedListener#onNothingSelected()
         */
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub        
        }
        public class ImageAdapter extends BaseAdapter {
         //add by yzg
         private ImageView mImageView;
         public void SetImageView(ImageView i)
         {
         mImageView = i;
         }
         public ImageView GetImageView()
         {
         return mImageView;
         }
            public ImageAdapter(Context c) {
                mContext = c;
            }        public int getCount() {
                return mThumbIds.length;
            }        public Object getItem(int position) {
                return position;
            }        public long getItemId(int position) {
                return position;
            }        public View getView(int position, View convertView, ViewGroup parent) {
                ImageView i = new ImageView(mContext);
                SetImageView(i);//add by yzg
                i.setImageResource(mThumbIds[position]);
                i.setAdjustViewBounds(true);
                i.setLayoutParams(new Gallery.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                i.setBackgroundResource(android.R.drawable.picture_frame);
                return i;
            }        private Context mContext;    }
    }
      

  2.   

    只要看这部分就可以了:
     private Timer m_Timer = new Timer();
      private Handler m_Handler = new Handler()
      {
      public void handleMessage(Message msg)
      {
      //Log.e("@@@",m_nIndex+"");
      if(mImageIds.length <= m_nIndex)
      {
      m_nIndex = 0;
      }
      mSwitcher.setImageResource(mImageIds[m_nIndex]);
      mSwitcher.invalidate();
      super.handleMessage(msg);
      }
      };
      m_Text = (EditText)findViewById(R.id.text);
      Button BtnSure = (Button)findViewById(R.id.sure);
      BtnSure.setOnClickListener(new OnClickListener()
      {
      public void onClick(View v)
      {
      String sText = m_Text.getText().toString();
      m_nTime = Integer.parseInt(sText);
      m_Timer.scheduleAtFixedRate(new TimerTask()
      {
      public void run()
      {
      m_nIndex++;
      Message msg = new Message();
      msg.what = m_nIndex;
      m_Handler.sendMessage(msg);
      }
      },0,m_nTime*1000);
      }
      });
      

  3.   

    所有已经存在于队列中的task都是不可控的,所以你是否在重设时间后,对Timer进行cancel和purge呢?这个问题,我曾经也在网络读取中碰到。
      

  4.   

    既然是队列中的task都是不可控的 那为什么时间短了就可以 长了就不行呢!!!
      

  5.   

    我也想过这个问题,曾经在重设时间后,对Timer进行cancel,不过这样作有错误
      

  6.   


    短时间的可以,是一种假像,因为执行时间很快就到达,还有执行周期短,都会以为是可控的,但实际上如果是网络读取的操作,5分钟超时等待,而短时间的队列触发更频繁,在我的项目开发中,app退出后,依然会触发后台service数据读取。
      

  7.   

    楼上正解
    问题已解决 
    已结贴
    求关注我的android 网络贴