Android利用回调机制:设计 咨询类 包含方法提供咨询,根据咨询者的提问给出答案; 咨询者类,提出问题给咨询类,显示答案。
时间: 2024-10-14 09:10:17 浏览: 18
Android中,回调机制常常用于处理异步操作的结果。例如,在网络请求、数据库查询或者其他需要时间完成的任务中,我们不能立即得到结果。在这种场景下,我们可以创建一个`咨询服务类`:
**咨询服务类(CallbackExampleService.java)**
```java
public class ConsultingService {
private final Callback callback;
public ConsultingService(Callback callback) {
this.callback = callback;
}
public void provideAdvice(String question) {
// 模拟异步操作,比如网络请求
new Thread(() -> {
try {
String answer = getAnswerFromServer(question);
runOnUiThread(() -> callback.onAdviceReceived(answer));
} catch (Exception e) {
callback.onError(e);
}
}).start();
}
// 这些是模拟的网络请求或计算返回结果的方法
private String getAnswerFromServer(String question) { ... }
private void onOnUiThread(Runnable action) { /* 使用runOnUiThread在主线程运行 */ }
interface Callback {
void onAdviceReceived(String advice);
void onError(Exception error);
}
}
```
**咨询者类(AskerActivity.java 或其他视图控制器)**
```java
public class AskerActivity extends AppCompatActivity {
private ConsultingService consultingService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_awaiter);
// 创建并设置回调
consultingService = new ConsultingService(new Callback() {
@Override
public void onAdviceReceived(String advice) {
showAdvice(advice);
}
@Override
public void onError(Exception error) {
showError(error.getMessage());
}
});
Button askButton = findViewById(R.id.ask_button);
askButton.setOnClickListener(v -> consultingService.provideAdvice(editTextQuestion.getText().toString()));
}
private void showAdvice(String advice) {
// 显示答案
textViewAnswer.setText(advice);
}
private void showError(String errorMessage) {
// 显示错误信息
Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show();
}
}
// 相关问题:
1. 如何处理多种类型的咨询请求,如网络请求和本地存储?
2. 如果在onAdviceReceived里有耗时的操作,如何避免ANR?
3. 如何优化这种结构,提高用户体验?
```
阅读全文