Android中无法通过Callback函数显示Toast的技术问题求助
问题解决:Callback中Log正常但Toast无法显示
问题原因
你的httpPost方法在子线程中执行网络请求,请求完成后直接在子线程里调用了callback.success()。而Android规定所有UI操作(包括显示Toast)必须在主线程中执行,所以Toast无法正常触发。
解决方案
有两种常见的修复方式:
方式1:在Callback中手动切换到主线程
修改按钮点击事件里的Callback实现,用runOnUiThread将Toast操作切换到主线程:
button.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onClick(View view) { server.httpPost("https://google.com/index.php?username=Peter"); server.callback = new Server.Callback() { @Override public void success(String response) { Log.d("test", response); // 切换到主线程显示Toast AddActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(AddActivity.this, response, Toast.LENGTH_SHORT).show(); } }); } }; } });
方式2:在httpPost方法内部统一切换到主线程调用Callback
这种方式更优雅,上层调用无需再处理线程切换:
修改httpPost方法中调用callback.success的部分:
if(responseCode == HttpURLConnection.HTTP_OK){ InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); stringBuilder.setLength(0); while ((line = reader.readLine()) != null) { stringBuilder.append(line); } final String response = stringBuilder.toString(); // 切换到主线程执行Callback new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { callback.success(response); } }); }
修改后,按钮点击事件里的Callback可以直接写Toast:
server.callback = new Server.Callback() { @Override public void success(String response) { Log.d("test", response); Toast.makeText(AddActivity.this, response, Toast.LENGTH_SHORT).show(); } };
内容的提问来源于stack exchange,提问作者new
相关产品推荐
相关产品推荐

