android studio 定时更新Activity界面元素问题

mooncmy 2018-01-15 02:11:49
背景:以前用eclipse,最近改用android studio。
起因:android studio中编写程序定时每隔1秒钟去更新Activity界面上TextView的内容

按照以前eclipse的方法一:定时器(或线程) + Handler ;定时器(或线程)延时后发消息给Handler,在Handler里TextView.setText,可是在android studio中Handler 需要写成静态的,不然就警告内存泄漏:( This Handler class should be static or leaks might occur),但是如果Handler 写成静态的TextView也要写成静态的,系统也要警告TextView内存泄漏(Do not place Android context classes in static fields; this is a memory leak),这个问题怎么解决?

按照以前eclipse的方法二:定时器(或线程)+ AsyncTask;定时器(或线程)延时后调用AsyncTask的execute,在AsyncTask的的onPostExecute里TextView.setText,可是在android studio中AsyncTask需要写成静态的,不然就警告内存泄漏:(This AsyncTask class should be static or leaks might occur),但是如果AsyncTask 写成静态的TextView也要写成静态的,系统也要警告TextView内存泄漏(Do not place Android context classes in static fields; this is a memory leak),这个问题怎么解决?

请教站内高手,有其他方法吗或者怎么写才没有警告???


...全文
829 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
怀君 2018-01-17
  • 打赏
  • 举报
回复
当Activity关闭时,在onDesory,方法里强行销毁 Handle
mooncmy 2018-01-17
  • 打赏
  • 举报
回复
[quote=引用 2 楼 jklwan 的回复:] 正解,谢谢。昨天我已经看到网上一篇文章,也是这样用的: WeakReference<WelcomeActivity> reference; private MyHandler(WelcomeActivity activity) { reference = new WeakReference<>(activity); }
jklwan 2018-01-15
  • 打赏
  • 举报
回复
在Activity中的Handler,AsyncTask类为了防止内存泄露才写成静态的,既然用静态内部类,就传入当前Activity,用WeakReference防止内存泄露。 参考代码

public class TestActivity extends AppCompatActivity {
    private TextView textView;
    private UpdateHandler handler;
    private int count = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        textView = findViewById(R.id.text);
        handler = new UpdateHandler(this);

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (count < 100 || isFinishing()) {
                    count++;
                    Message msg = handler.obtainMessage();
                    msg.obj = String.valueOf(count);
                    handler.sendMessage(msg);
                    SystemClock.sleep(1000);
                }
            }
        }).start();
    }

    private static class UpdateHandler extends Handler{
        private WeakReference<TestActivity> reference;

        public UpdateHandler(TestActivity activity) {
            this.reference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            if (reference != null && reference.get() != null){
                TestActivity activity  = reference.get();
                activity.textView.setText(String.valueOf(msg.obj));
            }
        }
    }
}
AsyncTask同理
mooncmy 2018-01-15
  • 打赏
  • 举报
回复
千万别说用 @SuppressLint,呵呵

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧