计时器导致ImageView可见性错误

6
package name.cpr;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.Timer;
import java.util.TimerTask;

public class ExampleActivity extends ActionBarActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        Timer timer = new Timer();
        timer.schedule(new CheckConnection(), 0, 3000);
        ImageView iv = (ImageView) findViewById(R.id.imageView);
        iv.setVisibility(View.VISIBLE);
    }
    class CheckConnection extends TimerTask{
        public void run(){
            ImageView iv = (ImageView) findViewById(R.id.imageView);
            iv.setVisibility(View.INVISIBLE); //<- Unfortunatly Error Here
        }
    }
}

启动应用程序,第一次图像视图可见性工作,但计时器不工作,如果计时器启动,则出现相同的错误"很抱歉...已停止"


2
你可能想修改你的问题,朋友。添加错误日志并添加Android标签 :) - cgew85
2
请提供完整的错误形式logcat。 - gio
2个回答

0

您可能想要使用android.os.Handler。

public class ExampleActivity extends ActionBarActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        ImageView iv = (ImageView) findViewById(R.id.imageView);
        iv.setVisibility(View.VISIBLE);
        //
        new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                        iv.setVisibility(View.INVISIBLE);
                }
        }, 3000);
    }
}

祝你好运。:)


3
这是正确的方法:使用“处理程序(Handler)”。这段代码将等待3秒钟,然后隐藏图片;OP的代码会立即隐藏图片,然后等待3秒钟再次隐藏……循环如此。 - rekaszeru

0
你正在从非 GUI 线程更新 GUI 元素,这会导致一个 RuntimeException。修复的一种方法是使用 Handler:
public class ExampleActivity extends Activity
{
    private ImageView iv;
    private ImgHandler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);

        this.iv = (ImageView) findViewById(R.id.imageView);
        this.iv.setVisibility(View.VISIBLE);
        this.handler = new ImgHandler(this.iv);

        final Timer timer = new Timer();
        timer.schedule(new CheckConnection(), 0, 3000);
    }

    /**
     * The timer task to run every 3 seconds
     */
    private final class CheckConnection extends TimerTask
    {
        public void run()
        {
            handler.sendEmptyMessage(0);
        }
    }

    /**
     * Custom <b>static</b> handler to bridge between the timer task's thread and the gui
     */
    private static final class ImgHandler extends Handler
    {
        // use a weak reference to the ImageView instance you'd like to manipulate:
        private final WeakReference<ImageView> imageReference;

        public ImgHandler(final ImageView img)
        {
            this.imageReference = new WeakReference<ImageView>(img);
        }

        @Override
        public void handleMessage(Message msg)
        {
            if (imageReference == null)
                return; // no image to show / hide
            final ImageView img = imageReference.get();
            // since this is the single message we are handling, no switch is used:
            if (img != null)
            {
                img.setVisibility(img.getVisibility() == View.VISIBLE ? View.INVISIBLE : View.VISIBLE);
            }
        }
    }
}

上面的例子将每3秒更改imageView的可见性,尽管从您的示例中不清楚这是否是您的意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接