核心思想
在 Android 开发中,你的业务逻辑、数据处理、网络请求等核心代码通常都写在 Java (或 Kotlin) 类中,Android 的 UI 组件(如 Activity 或 Fragment)的主要职责是:
- 展示 UI。
- 响应用户交互(如点击按钮)。
- 调用 Java 方法来处理业务逻辑,并根据方法的返回结果更新 UI。
在同一个 Activity/Fragment 中调用方法
这是最简单的情况,你直接在 Activity 或 Fragment 类中定义一个方法,然后在同一个类的任何地方调用它。
示例:
- 在
MainActivity.java中定义一个方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 在 onCreate 方法中调用我们自定义的 Java 方法
sayHello();
int sumResult = addTwoNumbers(10, 5);
Log.d("MainActivity", "10 + 5 = " + sumResult);
}
/**
* 一个简单的 Java 方法,没有返回值,没有参数
*/
private void sayHello() {
Log.d("MainActivity", "Hello from Java method!");
// 你也可以在这里更新 UI
TextView tvGreeting = findViewById(R.id.tv_greeting);
tvGreeting.setText("Hello from Java method!");
}
/**
* 一个有返回值和参数的 Java 方法
* @param a 第一个数字
* @param b 第二个数字
* @return a 和 b 的和
*/
private int addTwoNumbers(int a, int b) {
return a + b;
}
}
说明:
sayHello()是一个无返回值(void)的方法。addTwoNumbers(int a, int b)是一个有返回值(int)和两个参数的方法。- 在同一个类中,你可以直接通过方法名来调用它们,就像调用任何其他普通 Java 方法一样。
在 Activity 中调用另一个 Java 类的方法
当你的代码变得复杂时,你需要将逻辑拆分到不同的类中,这时,你需要在 Activity 中创建其他类的实例,然后通过这个实例来调用方法。
步骤:
- 创建一个普通的 Java 类(
MyCalculator.java)。 - 在这个类中定义你想要调用的方法。
- 在
Activity中创建这个类的对象。 - 通过对象来调用方法。
示例:
创建 MyCalculator.java
// MyCalculator.java
public class MyCalculator {
// 一个简单的加法方法
public int add(int a, int b) {
return a + b;
}
// 一个带逻辑判断的方法
public String checkNumber(int number) {
if (number > 0) {
return "是正数";
} else if (number < 0) {
return "是负数";
} else {
return "是零";
}
}
}
在 MainActivity.java 中调用
// MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1. 创建 MyCalculator 类的实例
MyCalculator myCalculator = new MyCalculator();
// 2. 通过实例调用 add 方法
int sum = myCalculator.add(20, 30);
Log.d("MainActivity", "20 + 30 = " + sum);
// 3. 通过实例调用 checkNumber 方法
String result = myCalculator.checkNumber(-10);
Log.d("MainActivity", "-10 是 " + result);
// 更新 UI
TextView tvResult = findViewById(R.id.tv_result);
tvResult.setText("计算结果: " + sum + ", 判断结果: " + result);
}
}
调用带回调的 Java 方法(异步操作)
在 Android 中,网络请求、数据库操作等通常耗时,不能在主线程(UI 线程)中执行,否则会导致应用卡顿甚至崩溃,这时,我们通常使用异步任务(如 AsyncTask, Thread, ExecutorService)或现代的 Coroutines/RxJava。
这里以一个简单的 Thread 为例,展示如何通过回调将结果返回给 Activity。
核心思想:
- 在 Java 方法中执行耗时任务(
Thread.sleep())。 - 任务完成后,通过一个回调接口(
interface)通知调用者(Activity)。 Activity实现这个接口,并在回调方法中更新 UI。
示例:
定义一个回调接口 DataCallback.java
// DataCallback.java
public interface DataCallback {
// 当数据准备好时,调用这个方法
void onDataReady(String data);
}
创建一个处理耗时任务的 Java 类 DataLoader.java
// DataLoader.java
public class DataLoader {
public void fetchData(final DataCallback callback) {
// 模拟耗时操作,比如网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
// 模拟耗时 2 秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 任务完成后,通过回调返回数据
// 注意:不能在子线程中直接更新 UI!
callback.onDataReady("这是从网络获取的数据!");
}
}).start();
}
}
在 MainActivity.java 中实现接口并调用
// MainActivity.java
public class MainActivity extends AppCompatActivity implements DataCallback {
private TextView tvData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvData = findViewById(R.id.tv_data);
// 1. 创建 DataLoader 实例
DataLoader dataLoader = new DataLoader();
// 2. 调用 fetchData 方法,并将自己(this)作为回调传进去
dataLoader.fetchData(this);
// 立即显示一个提示
tvData.setText("正在加载数据,请稍候...");
}
// 3. 实现 DataCallback 接口中的 onDataReady 方法
// 这个方法会在 DataLoader 中的耗时任务完成后被调用
@Override
public void onDataReady(String data) {
// 这个回调方法是在子线程中执行的,不能直接更新 UI!
// 必须切换回主线程才能更新 UI。
runOnUiThread(new Runnable() {
@Override
public void run() {
tvData.setText(data);
}
});
}
}
说明:
MainActivity实现了DataCallback接口。MainActivity将自己 (this) 传递给DataLoader。- 当
DataLoader完成任务后,它会调用callback.onDataReady(...),这实际上就是调用了MainActivity中的onDataReady方法。 runOnUiThread是一个关键点,因为onDataReady是在子线程中被调用的,而 Android 的 UI 操作必须在主线程进行。runOnUiThread会确保其内部的代码在主线程上执行。
| 场景 | 关键点 | 适用情况 |
|---|---|---|
| 同一类内调用 | 直接通过方法名调用 | 简单逻辑,代码量少。 |
| 跨类调用 | 创建目标类的实例,通过实例调用方法 | 将业务逻辑与 UI 分离,代码结构更清晰。 |
| 异步回调调用 | 定义回调接口 异步任务完成后调用接口方法 在 Activity 中实现接口,并在回调中用 runOnUiThread 更新 UI |
处理网络请求、文件读写等耗时操作,避免阻塞 UI 线程。 |
对于现代 Android 开发,推荐使用 Kotlin Coroutines 或 RxJava 来处理异步任务,它们比传统的 Thread + Callback 模式更简洁、更安全、更易于管理,但理解上述基础原理是掌握更高级技术的前提。
