当前位置: 首页 > news >正文

品牌网站官网dw软件怎么制作网页

品牌网站官网,dw软件怎么制作网页,可以发锚文本的网站,企业邮箱号怎么注册Android中简单封装Livedata工具类 前言: 之前讲解过livedata和viewmodel的简单使用,也封装过room工具类,本文是对livedata的简单封装和使用,先是封装了一个简单的工具类,然后实现了一个倒计时工具类的封装. 1.LiveD…

Android中简单封装Livedata工具类

前言:

之前讲解过livedata和viewmodel的简单使用,也封装过room工具类,本文是对livedata的简单封装和使用,先是封装了一个简单的工具类,然后实现了一个倒计时工具类的封装.

1.LiveDataHelper工具类:

package com.example.livedatautilsdemo.helper;import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;import java.util.Map;
import java.util.WeakHashMap;/*** @author: njb* @date: 2023/7/31 0:10* @desc:*/
public class LiveDataHelper<T>extends MutableLiveData {private final WeakHashMap<Observer<T>, Boolean> mObservers = new WeakHashMap<>();@Overridepublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {mObservers.put((Observer<T>) observer, true);super.observe(owner, observer);}@Overridepublic void removeObserver(@NonNull Observer observer) {mObservers.remove(observer);super.removeObserver(observer);}@Overridepublic void removeObservers(@NonNull LifecycleOwner owner) {mObservers.clear();super.removeObservers(owner);}public void setValue(Object value) {for (Map.Entry<Observer<T>, Boolean> entry : mObservers.entrySet()) {if (entry.getValue()) {entry.setValue(false);entry.getKey().onChanged((T) value);}}}public void call() {setValue(null);}
}

2.简单使用:

private LiveDataHelper<String> mLiveDataHelper = new LiveDataHelper<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initTime();}private void initView() {tvName = findViewById(R.id.textview);tvTime = findViewById(R.id.tvTime);}private void initData() {mLiveDataHelper.observe(this, new Observer<String>() {@Overridepublic void onChanged(String name) {Log.d("LiveDataDemo", "onChanged: " + name);}});tvName.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String newName = "NewName" + new Random().nextInt(100);mLiveDataHelper.setValue(newName);Log.d("LiveDataDemo", "onClick: " + newName);tvName.setText(String.format("名称发生变化:%s", newName));}});}

3.布局代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textview"android:layout_width="200dp"android:layout_height="60dp"android:text="Hello World!"android:background="@color/design_default_color_primary"android:textSize="20sp"android:textColor="@color/white"android:focusable="true"android:gravity="center"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tvTime"android:layout_width="200dp"android:layout_height="60dp"android:background="@color/design_default_color_primary"android:text="timer"android:textSize="20sp"android:textColor="@color/white"android:focusable="true"android:gravity="center"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/textview"android:layout_marginTop="20dp"/></androidx.constraintlayout.widget.ConstraintLayout>

4.实现效果如下:

在这里插入图片描述

5.封装一个倒计时工具类:

package com.example.livedatautilsdemo.helper;import android.os.CountDownTimer;import androidx.lifecycle.MutableLiveData;/*** @author: njb* @date: 2023/8/6 23:37* @desc:*/
public class LiveDataTimeHelper extends MutableLiveData<Long> {private CountDownTimer countDownTimer;public void startCountDown(long millisInFuture, long countDownInterval) {countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) {@Overridepublic void onTick(long millisUntilFinished) {setValue(millisUntilFinished / 1000);}@Overridepublic void onFinish() {setValue(0L);}};countDownTimer.start();}public void stopCountDown() {if (countDownTimer != null) {countDownTimer.cancel();}}@Overrideprotected void onInactive() {super.onInactive();stopCountDown();}
}

6.倒计时Viewmodel:

package com.example.livedatautilsdemo.viewmodel;import android.os.Handler;
import android.os.Looper;
import android.util.Log;import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;import com.example.livedatautilsdemo.helper.LiveDataHelper;
import com.example.livedatautilsdemo.helper.LiveDataTimeHelper;import java.util.Timer;
import java.util.TimerTask;/*** @author: njb* @date: 2023/8/2 23:40* @desc:*/
public class TimerLiveDataViewModel extends ViewModel {private LiveDataTimeHelper liveDataHelper;public LiveDataTimeHelper getCurrentSecondLiveData() {if (liveDataHelper == null) {liveDataHelper = new LiveDataTimeHelper();}return liveDataHelper;}public void startTiming(int seconds) {if (liveDataHelper != null) {liveDataHelper.startCountDown(seconds * 1000, 1000);}}public void stopTiming() {if (liveDataHelper != null) {liveDataHelper.stopCountDown();}}@Overrideprotected void onCleared() {super.onCleared();stopTiming();}
}

7.简单使用:

package com.example.livedatautilsdemo.viewmodel;import android.os.Handler;
import android.os.Looper;
import android.util.Log;import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;import com.example.livedatautilsdemo.helper.LiveDataHelper;
import com.example.livedatautilsdemo.helper.LiveDataTimeHelper;import java.util.Timer;
import java.util.TimerTask;/*** @author: njb* @date: 2023/8/2 23:40* @desc:*/
public class TimerLiveDataViewModel extends ViewModel {private LiveDataTimeHelper liveDataHelper;public LiveDataTimeHelper getCurrentSecondLiveData() {if (liveDataHelper == null) {liveDataHelper = new LiveDataTimeHelper();}return liveDataHelper;}public void startTiming(int seconds) {if (liveDataHelper != null) {liveDataHelper.startCountDown(seconds * 1000, 1000);}}public void stopTiming() {if (liveDataHelper != null) {liveDataHelper.stopCountDown();}}@Overrideprotected void onCleared() {super.onCleared();stopTiming();}
}

8.实现效果如下:

在这里插入图片描述

9.项目源码如下:

https://gitee.com/jackning_admin/live-data-utils-demo

http://www.dt0577.cn/news/11186.html

相关文章:

  • 顺德网络营销网站长沙网站seo收费
  • 网站建设款分录数据分析师
  • dedecms做论坛网站sem是指什么
  • 创意礼品做的比较好的网站关键词林俊杰mp3
  • 福建住房和城乡建设网站seo发外链的网站
  • 韩国网站模板磁力宅
  • 做网站需要哪些人员舆情通
  • 360免费建站模板seo网站关键词优化报价
  • 武清网站建设公关
  • 做项目接任务的网站nba最新交易汇总实时更新
  • 重庆交换夫妻做网站如何做线上营销
  • 微信营销的案例宁波seo优化公司
  • 济南网站价格怎么做网站
  • 外贸电商网站制作各大搜索引擎收录入口
  • web中英文网站怎么做上海营销公司
  • 做淘宝那样的网站长沙网站定制公司
  • 宜春网站建设公司seo优化师就业前景
  • 深圳外贸网站建设企业网站查询域名入口
  • 为吴铮真做网站的男生中国世界排名
  • 湖南政府网官网进入网站seo优化服务
  • 即墨市网站建设什么是sem推广
  • godaddy 网站上传东莞推广系统
  • 南京做企业网站公司净水器十大品牌
  • 交网站建设域名计入什么科目网络平台推广是干什么
  • 深圳做网站公司排名网站源码建站
  • 手机做的兼职网站设计seo文章排名优化
  • win2008系统asp网站建设小型项目外包网站
  • 如何把网站做成appseo网站推广助理招聘
  • 网站建设 需求分析报告百度推广客户端手机版
  • 政府网站建设 价格策划推广方案