如何实现仅当SearchView输入非空时才解析并生成有效链接?
解决方案:仅在搜索框非空时发起API请求
你的核心问题是没有对搜索框的输入值做非空校验,不管输入是否为空都会直接拼接URL发起请求,所以才会生成带空ingr参数的无效链接。可以通过以下两步修改解决:
1. 在AsyncTask内部增加前置校验
在doInBackground方法开头,先判断搜索文本是否为空或全是空白字符,不满足条件就直接返回,跳过网络请求逻辑:
@Override protected String doInBackground(String... strings) { String current = ""; // 先获取并处理搜索文本,去除首尾空白 SEARCH_TEXT = binding.searchs.getQuery().toString().trim(); // 校验:如果为空或全空白,直接返回,不执行请求 if (SEARCH_TEXT.isEmpty()) { return current; } try { URL url; HttpURLConnection urlConnection = null; try { url = new URL(PARSE_URL + END_URL + SEARCH_TEXT); urlConnection = (HttpURLConnection) url.openConnection(); InputStream is = urlConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); int data = isr.read(); while (data != -1) { current += (char) data; data = isr.read(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(urlConnection != null) { urlConnection.disconnect(); } } } catch (Exception e) { e.printStackTrace(); } return current; }
2. 在搜索触发入口提前拦截(更高效)
最好在触发搜索的源头(比如SearchView的OnQueryTextListener回调里)就做校验,这样连AsyncTask都不用启动,节省资源:
binding.searchs.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { String trimmedQuery = query.trim(); // 只有非空才启动AsyncTask if (!trimmedQuery.isEmpty()) { // 这里执行你的AsyncTask启动逻辑,比如new YourTask().execute(); } return true; } @Override public boolean onQueryTextChange(String newText) { // 如果需要实时搜索,也可以在这里做类似校验 return false; } });
这样就能确保只有当搜索框有有效输入时,才会生成正确的API链接并发起请求,不会出现带空ingr参数的情况。
内容的提问来源于stack exchange,提问作者sounds of nature
相关产品推荐
相关产品推荐

