杰瑞科技汇

Android如何调用Java方法?

核心思想

在 Android 开发中,你的业务逻辑、数据处理、网络请求等核心代码通常都写在 Java (或 Kotlin) 类中,Android 的 UI 组件(如 ActivityFragment)的主要职责是:

  1. 展示 UI
  2. 响应用户交互(如点击按钮)。
  3. 调用 Java 方法来处理业务逻辑,并根据方法的返回结果更新 UI。

在同一个 Activity/Fragment 中调用方法

这是最简单的情况,你直接在 ActivityFragment 类中定义一个方法,然后在同一个类的任何地方调用它。

示例:

  1. 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 中创建其他类的实例,然后通过这个实例来调用方法。

步骤:

  1. 创建一个普通的 Java 类MyCalculator.java)。
  2. 在这个类中定义你想要调用的方法
  3. Activity 中创建这个类的对象
  4. 通过对象来调用方法

示例:

创建 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

核心思想:

  1. 在 Java 方法中执行耗时任务(Thread.sleep())。
  2. 任务完成后,通过一个回调接口(interface)通知调用者(Activity)。
  3. 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 CoroutinesRxJava 来处理异步任务,它们比传统的 Thread + Callback 模式更简洁、更安全、更易于管理,但理解上述基础原理是掌握更高级技术的前提。

分享:
扫描分享到社交APP
上一篇
下一篇