android new Handler().postDelayed() 延迟intent跳转

本文介绍了如何在Android应用中使用Handler对象实现延迟跳转功能。通过Handler的postDelayed方法,可以设定Intent在指定时间后启动另一个Activity,实现每隔一定时间的周期性处理。
  1. //延迟两秒跳转   
  2. new Handler().postDelayed(new Runnable() {  
  3.       
  4.     @Override  
  5.     public void run() {  
  6.         Intent  intent=new Intent(MainActivity.this, Leansons.class);  
  7.         startActivity(intent);    
  8.     }  
  9. }, 2000);  

handler顾名思义就是处理者的意思,每个acvivity只有一个Handler对象,这里利用handler.postDelayed(r,1000),在MessageQuene队列中要求延迟1秒后进行r的处理,而在r的处理中, 最后在handler的队列中加 入一个要求延迟1秒的处理,如是,就可以实现每隔2秒的定期处理。
同理,HomeFragment代码如下:package com.example.bus.ui.home; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.amap.api.services.core.AMapException; import com.amap.api.services.help.Inputtips; import com.amap.api.services.help.Tip; import com.example.bus.MainActivity; import com.example.bus.SearchResultActivity; import com.example.bus.databinding.FragmentHomeBinding; import java.util.List; import android.widget.ArrayAdapter; import android.text.TextWatcher; import android.text.Editable; public class HomeFragment extends Fragment { private FragmentHomeBinding binding; private Inputtips inputTips; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { HomeViewModel homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); binding = FragmentHomeBinding.inflate(inflater, container, false); View root = binding.getRoot(); final TextView textView = binding.textHome; homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); setupSearchSuggestion(); binding.homeSearch.setOnClickListener(v -> { String keyword = binding.homeInput.getText().toString().trim(); if (keyword.isEmpty()) { Toast.makeText(requireContext(), "请输入关键词", Toast.LENGTH_SHORT).show(); return; } // ✅ 请求权限,权限通过后再跳转 SearchResultActivity MainActivity activity = (MainActivity) requireActivity(); activity.ensureFineLocationPermission(() -> { Intent intent = new Intent(requireContext(), SearchResultActivity.class); intent.putExtra("keyword", keyword); startActivity(intent); }); }); return root; } private void setupSearchSuggestion() { try { inputTips = new Inputtips(requireContext(), new Inputtips.InputtipsListener() { @Override public void onGetInputtips(List<Tip> tipList, int rCode) { if (rCode == 1000 && tipList != null && !tipList.isEmpty()) { String[] arr = new String[tipList.size()]; for (int i = 0; i < tipList.size(); i++) { arr[i] = tipList.get(i).getName(); } ArrayAdapter<String> adapter = new ArrayAdapter<>( requireContext(), android.R.layout.simple_dropdown_item_1line, arr ); binding.homeInput.setAdapter(adapter); } else { binding.homeInput.setAdapter(null); handleSearchError(rCode); } } }); } catch (AMapException e) { throw new RuntimeException(e); } // 创建 Handler 用于防抖 Handler handler = new Handler(Looper.getMainLooper()); Runnable pendingRunnable = null; binding.homeInput.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 清除上一次的延迟任务 if (pendingRunnable != null) { handler.removeCallbacks(pendingRunnable); } if (s.length() == 0) { binding.homeInput.setAdapter(null); return; } // 延迟执行请求,避免频繁调用 pendingRunnable = () -> { try { inputTips.requestInputtips(s.toString(), "全国"); } catch (AMapException e) { e.printStackTrace(); Toast.makeText(requireContext(), "输入提示请求失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } }; handler.postDelayed(pendingRunnable, 600); // 防抖 600ms } @Override public void afterTextChanged(Editable s) {} }); } private void handleSearchError(int rCode) { String msg; switch (rCode) { case 12: msg = "API Key 错误,请检查 AndroidManifest.xml"; break; case 27: msg = "网络连接失败"; break; case 30: msg = "SHA1 或包名未正确配置"; break; case 33: msg = "请求过于频繁,请稍后再试"; break; default: msg = "搜索失败,错误码: " + rCode; break; } Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onDestroyView() { super.onDestroyView(); inputTips = null; binding = null; } } 报错Variable 'pendingRunnable' is accessed from within inner class, needs to be final or effectively final
11-22
是的,只需要最小量的修改代码即可,目前已有的其它逻辑暂不修改。先把这个完善后再去进行下一步。目前代码如下:package com.example.bus.ui.home; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.bus.MainActivity; import com.example.bus.RealTimePoiSuggestHelper; import com.example.bus.SearchResultActivity; import com.example.bus.databinding.FragmentHomeBinding; public class HomeFragment extends Fragment { private FragmentHomeBinding binding; private HomeViewModel homeViewModel; private static final int TIPS_DELAY = 300; // 防抖延迟 private Handler handler = new Handler(Looper.getMainLooper()); private Runnable pendingRequest; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentHomeBinding.inflate(inflater, container, false); View root = binding.getRoot(); // 初始化 ViewModel homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); homeViewModel.getText().observe(getViewLifecycleOwner(), text -> { binding.textHome.setText(text); }); setupSearchSuggestion(); setupSearchAction(); return root; } /** * 设置输入建议功能(suggestion) */ private void setupSearchSuggestion() { // 创建建议助手 RealTimePoiSuggestHelper suggestHelper = new RealTimePoiSuggestHelper(requireContext()); suggestHelper.setCurrentCity("全国"); // 可改为动态城市 suggestHelper.setCallback(suggestions -> { if (suggestions.length > 0) { ArrayAdapter<String> adapter = new ArrayAdapter<>( requireContext(), android.R.layout.simple_dropdown_item_1line, suggestions ) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); // 👉 添加点击事件 view.setOnClickListener(v -> { String selectedText = getItem(position); if (selectedText != null && !selectedText.isEmpty()) { binding.homeInput.setText(selectedText); binding.homeInput.clearFocus(); // 隐藏软键盘 InputMethodManager imm = (InputMethodManager) requireContext() .getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(binding.homeInput.getWindowToken(), 0); } // 直接触发搜索(跳转到 SearchResultActivity) performSearch(); } }); return view; } }; // 主线程更新 UI new Handler(Looper.getMainLooper()).post(() -> { binding.homeInput.setAdapter(adapter); if (requireActivity().getCurrentFocus() == binding.homeInput) { binding.homeInput.showDropDown(); } }); } else { new Handler(Looper.getMainLooper()).post(() -> binding.homeInput.setAdapter(null) ); } }); // 防抖控制 handler = new Handler(Looper.getMainLooper()); pendingRequest = null; binding.homeInput.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (pendingRequest != null) { handler.removeCallbacks(pendingRequest); } if (s.length() == 0) { binding.homeInput.setAdapter(null); return; } pendingRequest = () -> suggestHelper.requestSuggestions(s.toString()); handler.postDelayed(pendingRequest, TIPS_DELAY); } @Override public void afterTextChanged(Editable s) {} }); } /** * 设置搜索动作:回车 & 按钮点击 */ private void setupSearchAction() { // 回车搜索 binding.homeInput.setOnEditorActionListener((v, actionId, event) -> { if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_SEARCH) { performSearch(); return true; } return false; }); // 搜索按钮点击 binding.homeSearch.setOnClickListener(v -> performSearch()); } private void performSearch() { String keyword = binding.homeInput.getText().toString().trim(); if (keyword.isEmpty()) { Toast.makeText(requireContext(), "请输入关键词", Toast.LENGTH_SHORT).show(); return; } MainActivity activity = (MainActivity) requireActivity(); activity.ensureFineLocationPermission(() -> { Intent intent = new Intent(requireContext(), SearchResultActivity.class); intent.putExtra("keyword", keyword); startActivity(intent); }); } @Override public void onDestroyView() { super.onDestroyView(); binding = null; // 清理防抖任务 if (handler != null) { handler.removeCallbacksAndMessages(null); } } } 请问哪个方法需要修改你给我提供修改好的完整方法
最新发布
12-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值