如何理解handler.postDelayed方法的用途与意义?

介绍了一个灵活的方法,可以通过传递Runnable对象和指定的时间毫秒数来安排延时任务。这种方法不仅能够替代计时器,还能在任务执行前随时取消,非常适合自定义View的应用。

这个方法接收两个参数,一个是Runnable对象,一个是一个long的时间毫秒数。这个方法好在,我们可以在将来的某一个时间执行一段代码,这个看起来是非常棒的。

这个可以替代掉计时器的作用。并且,这个时间到来之前,我们随时可以移除掉这个Runnable对象。只需要通过handler.removecallbacks方法即可,非常好用。这种灵活性的搭配,使得这个方法在许多的自定义view中用途广发。

package com.example.layoutdome; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class WebPreloadedActivity extends AppCompatActivity { private Handler handler; private Runnable runnable; private WebView backgroundWebView; private NetworkReceiver networkReceiver; private TextView textView; private ProgressBar progressBar; private String receivedValue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_preloaded); receivedValue = getIntent().getStringExtra("value", "0"); // 默认为 0 initView(); initData(); } private void initData() { handler = new Handler(); networkReceiver = new NetworkReceiver(isConnected -> { if (isConnected) { // 如果网络连接正常,启动指定应用 //openApp("com.yiluan.businfo"); textView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE); textView.setText("正在预加载网页..."); loadWebViewInBackground(); } else { textView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE); } }); } private void initView() { textView = (TextView) findViewById(R.id.text); progressBar = (ProgressBar) findViewById(R.id.progress); } @Override protected void onStart() { super.onStart(); // 注册网络变化的监听 registerReceiver(networkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } @Override protected void onStop() { super.onStop(); // 注销网络变化的监听 unregisterReceiver(networkReceiver); } @Override protected void onDestroy() { super.onDestroy(); if (handler != null) { handler.removeCallbacksAndMessages(null); } if (backgroundWebView != null) { backgroundWebView.destroy(); } } // 启动指定应用 private void openApp(String packageName) { Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); if (intent != null) { startActivity(intent); } else { Toast.makeText(this, "App not installed", Toast.LENGTH_SHORT).show(); } } private String getTopUrlByValue(String value) { switch (value) { case "1": return "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1"; case "2": return "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2"; case "0": default: return "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0"; } } private String getMainUrlByValue(String value) { switch (value) { case "1": return "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02"; case "2": return "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02"; case "0": default: return "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02"; } } // 后台加载 WebView @SuppressLint("SetJavaScriptEnabled") private void loadWebViewInBackground() { backgroundWebView = new WebView(this); backgroundWebView.getSettings().setJavaScriptEnabled(true); String topUrl = getTopUrlByValue(receivedValue); String mainUrl = getMainUrlByValue(receivedValue); backgroundWebView.setWebViewClient(new WebViewClient() { private boolean topPageLoaded = false; private boolean mainPageLoaded = false; @Override public void onPageFinished(WebView view, String url) { if (url.equals(topUrl)) { topPageLoaded = true; } else if (url.equals(mainUrl)) { mainPageLoaded = true; } if (topPageLoaded && mainPageLoaded) { Intent intent = new Intent(WebPreloadedActivity.this, MainActivity3.class); intent.putExtra("topUrl", topUrl); intent.putExtra("mainUrl", mainUrl); startActivity(intent); finish(); } } }); // 开始加载两个页面 backgroundWebView.loadUrl(topUrl); backgroundWebView.loadUrl(mainUrl); } }在这个页面获取package com.example.layoutdome; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener { private WebView webView, topWebView; private TextView tvMarquee; private FullScreenVideoView videoView; private String url; private String topUrl; private String lastValue = "";//避免不必要的页面加载 private Handler handler = new Handler(Looper.getMainLooper()); private Runnable refreshRunnable = new Runnable() { @Override public void run() { // 执行请求 new StyleRequest(MainActivity3.this).execute(); // 每 5 分钟重复执行 handler.postDelayed(this, 5 * 60 * 1000); } }; public static int getDeviceWidthInDp(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int widthPixels = displayMetrics.widthPixels; float density = displayMetrics.density; return (int) (widthPixels / density); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); webView = findViewById(R.id.web); topWebView = findViewById(R.id.webView); tvMarquee = (TextView) findViewById(R.id.tv_marquee); videoView = (FullScreenVideoView) findViewById(R.id.video); // 从 Intent 获取预加载的 URL Intent intent = getIntent(); String topUrl = intent.getStringExtra("topUrl"); String mainUrl = intent.getStringExtra("mainUrl"); if (topUrl != null && mainUrl != null) { SetUpTopTheWebPageWithUrl(topUrl); SetUpTheWebPageWithUrl(mainUrl); } else { // 如果没有预加载数据,则走原来的逻辑 // 1. 立即执行一次请求 new StyleRequest(this).execute(); // 启动定时任务:每 5 分钟执行一次 handler.postDelayed(refreshRunnable, 5 * 60 * 1000); // 5 分钟 } SetUpTheVideo(); SetUpMarquees(); int widthDp = getDeviceWidthInDp(this); Log.d("ScreenInfo", "Device width in dp: " + widthDp); initTopWebViewClient(); // 只设置一次 } private void initTopWebViewClient() { topWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("WebView", "开始加载: " + url); } @Override public void onPageFinished(WebView view, String url) { Log.d("WebView", "页面加载完成: " + url); view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { Log.e("WebView", "加载错误: " + error.toString()); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("WebView", "尝试加载: " + url); view.loadUrl(url); return true; } }); } @Override public void onStyleRequest(StyleList styleList) { String value = styleList.getData().getValue(); if (value != null && !value.equals(lastValue)) { SetUpTheWebPage(value); SetUpTopTheWebPage(value); lastValue = value; // 更新 lastValue } else { Log.d("MainActivity3", "value 未发生变化,跳过加载"); } } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPage(String value) { if (topWebView == null) { Log.e("SetUpTopTheWebPage", "topWebView 未初始化"); return; } WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); switch (value) { case "0": // 加载网页 topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0"; break; case "1": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1"; break; case "2": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2"; break; } // 清除缓存 topWebView.clearCache(true); topWebView.clearHistory(); Log.i("wangye", "dizhi" + topUrl); // 添加时间戳防止缓存 String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); // 预加载顶部 WebView topWebView.loadUrl("about:blank"); // 先加载空白页 // 然后再加载真实 URL new Handler(Looper.getMainLooper()).postDelayed(() -> { topWebView.loadUrl(finalUrl); }, 50); } private void SetUpMarquees() { tvMarquee.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整"); tvMarquee.setSelected(true); // 必须设置为 selected 才能启动 marquee tvMarquee.setFocusable(true); tvMarquee.setFocusableInTouchMode(true); tvMarquee.requestFocus(); // 强制获取焦点 } private void SetUpTheVideo() { // 视频文件的路径 String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4"; // 创建 File 对象 File videoFile = new File(videoPath); // 检查文件是否存在 if (videoFile.exists()) { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } else { // 文件不存在 Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); } // 设置视频路径 videoView.setVideoPath(videoPath); // 添加控制器 MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 播放视频 videoView.start(); } }); // 检查文件格式和编码是否受支持 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) { } // 处理不支持的文件格式或编码 Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra); return false; } }); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPage(String value) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); // 注入接口对象 webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); Log.d("MainActivity3", "value 发生变化,加载"); Log.i("MainActivity3", "下边距web:" + value); switch (value) { case "0": // 加载网页 url = "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02"; break; case "1": url = "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02"; break; case "2": url = "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02"; break; } // 设置 WebViewClient 以在应用内打开页面 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl(url); } public class JavascriptBroadcastInterfaces { private String lastBroadcast; // 保存上一次收到的 broadcast @JavascriptInterface public void getBroadcast(String broadcast) { Log.i("Broadcast", "Received broadcast: " + broadcast); // 如果新值和上次相同,直接返回 if (broadcast != null && broadcast.equals(lastBroadcast)) { Log.i("Broadcast", "重复的 broadcast,跳过播放"); return; } // 更新 lastBroadcast 为新的值 lastBroadcast = broadcast; // 构造音频 URL String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast; if (isUrlReachable(audioUrl, MainActivity3.this)) { // 开始播放音频 Log.e("Broadcast", "音频 URL :" + audioUrl); playAudioWithExoPlayer(audioUrl); } else { Log.e("Broadcast", "音频 URL 不可用"); } } SimpleExoPlayer player; private void playAudioWithExoPlayer(String audioUrl) { if (player != null) { player.release(); player = null; } TrackSelector trackSelector = new DefaultTrackSelector(); player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build(); MediaItem mediaItem = MediaItem.fromUri(audioUrl); player.setMediaItem(mediaItem); player.prepare(); player.play(); } } @Override public void onBackPressed() { // 如果 WebView 可以返回,则返回上一页 if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private boolean isUrlReachable(String audioUrl, Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo == null || !netInfo.isConnected()) { Log.e("Network", "No network connection"); return false; } try { URL url = new URL(audioUrl); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(3000); urlConn.setRequestMethod("HEAD"); int responseCode = urlConn.getResponseCode(); String contentType = urlConn.getContentType(); Log.d("URLCheck", "Response Code: " + responseCode); Log.d("URLCheck", "Content-Type: " + contentType); urlConn.disconnect(); return responseCode == HttpURLConnection.HTTP_OK; } catch (IOException e) { Log.e("URLCheck", "URL 不可达", e); return false; } } @Override protected void onDestroy() { super.onDestroy(); // 停止定时任务 handler.removeCallbacks(refreshRunnable); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPageWithUrl(String topUrl) { WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); topWebView.clearCache(true); topWebView.clearHistory(); String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); topWebView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> topWebView.loadUrl(finalUrl), 50); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPageWithUrl(String mainUrl) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50); } }这个页面的value值
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值