以下是一个使用 Android 和 Spring Boot 实现服务器发送事件(Server-Sent Events,SSE)通信的案例:
Spring Boot 端
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @RestController public class SseController { @GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter handleSseRequest() { SseEmitter emitter = new SseEmitter(); new Thread(() -> { try { for (int i = 0; i < 10; i++) { emitter.send("Message " + i); Thread.sleep(2000); } emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }).start(); return emitter; } }
在上述 Spring Boot 代码中,定义了一个处理 /events
路径的请求,返回一个 SseEmitter
对象,并在一个新线程中每隔 2 秒发送一条消息。
Android 端
import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; public class MainActivity extends AppCompatActivity { private TextView textView; private Button startButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); startButton = findViewById(R.id.startButton); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startSseRequest(); } }); } private void startSseRequest() { WebClient webClient = WebClient.create("http://your-server-url"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.TEXT_EVENT_STREAM); webClient.get() .uri("/events") .headers(headers) .retrieve() .bodyToFlux(String.class) .subscribe(response -> { Log.d("SSE", "Received: " + response); textView.append(response + "\n"); }, error -> { Log.e("SSE", "Error: " + error.getMessage()); }); } }
在上述 Android 代码中:
- 在
onCreate
方法中进行了界面元素的初始化和按钮点击事件的设置。 startSseRequest
方法中创建了WebClient
对象,设置请求头,发送请求,并处理响应和错误。
请注意,您需要将 your-server-url
替换为实际的服务器地址。
希望这个案例对您有所帮助!如果您在实际开发中遇到问题,可能需要根据具体的错误信息进行调试和优化。