如何在 Android 上将数据从 class 发送到 activity

How to send data from class to activity on Android

我在将数据从 class 发送到 activity 时遇到问题。我有 class(不是 activity)和静态方法:

public static void printUsageStats(List<UsageStats> usageStatsList){

    long totalTime = 0;

    for (UsageStats u : usageStatsList) {
        if ((u.getTotalTimeInForeground() > 0) && u.getPackageName().equals("com.facebook.katana")) {
            Log.d(TAG, "Pkg: " + u.getPackageName() + "\t" + "ForegroundTime: "
                    + u.getTotalTimeInForeground());

            totalTime = totalTime + u.getTotalTimeInForeground();

        }
    }
    System.out.println(totalTime);

}

而且我需要将变量 totalTime 发送到 mainactivity 以在单击按钮后使用此变量在 textview 上设置文本。

这是我在 mainactivity 中调用的第二种方法:

public static void printCurrentUsageStatus(Context context){
    printUsageStats(getUsageStatsList(context));

}

并且在 onCreate mainactivity 我称之为:

statsBtn = (Button) findViewById(R.id.stats_btn);
    statsBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            UStats.printCurrentUsageStatus(MainActivity2.this);

        }
    });

但是我无法在 textview 中设置文本。

至于当前的实现,您可以从 Activity 调用静态方法并从此方法获取返回值,这是最简单的方法。您还可以制作一个 DI (dagger/koin/hilt),制作一个带有 LiveData 的存储库并从 Activity 订阅此 LiveData 以获得新值。

方法 1 - Return 值

最直接的方法就是 return 您想要从方法中显示的值,就像这样

// change return type from 'void' to 'long' and add a 'return'
public static long printUsageStats(List<UsageStats> usageStatsList){

    // your existing code...

    return totalTime;
}

public static long printCurrentUsageStatus(Context context){
    return printUsageStats(getUsageStatsList(context));
}

然后您可以 return 时间值并将其设置在您的 activity

textFld = (TextView)findViewById(R.id.my_text);
statsBtn = (Button) findViewById(R.id.stats_btn);

statsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        long time = UStats.printCurrentUsageStatus(MainActivity2.this);
        textFld.setText(String.valueOf(time));
    }
});

方法 2 - 将 TextView 作为参数传递

或者您可以将 TextView 作为参数传递给函数,然后您可以在静态函数中设置值。

public static void printUsageStats(List<UsageStats> usageStatsList, TextView tv){

    // your existing code...

    tv.setText(String.valueOf(totalTime));
}

public static void printCurrentUsageStatus(Context context, TextView tv){
    printUsageStats(getUsageStatsList(context), tv);
}

然后这样称呼它

textFld = (TextView)findViewById(R.id.my_text);
statsBtn = (Button) findViewById(R.id.stats_btn);

statsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        UStats.printCurrentUsageStatus(MainActivity2.this, textFld);
    }
});