【问题标题】:How to change a void method to return a value in Java如何更改 void 方法以在 Java 中返回值
【发布时间】:2015-12-28 16:28:34
【问题描述】:

所以我是 java 新手,正在使用某人的开源代码进行 android 开发。我想在另一个活动中使用这个程序中的变量颜色。我尝试将 void 更改为 int ,然后在代码末尾返回颜色,但这并没有什么不同,代码也不起作用。我很困惑为什么 void 不返回任何东西,但 int 返回一个整数。我的问题是如何从该代码中获取变量颜色的值并将其存储在另一个变量中或使变量颜色本身,以便我可以在我的 android 应用程序的其他活动中使用它。这是我的代码:

public void onPreviewFrame(byte[] data, Camera camera) {

        try {
            Camera.Size previewSize = camera.getParameters().getPreviewSize();
            int height = previewSize.height;
            int width = previewSize.width;

            ColorModelConverter converter = new ColorModelConverter(height, width);
            int[] pixels = converter.convert(data, this.colorFormat);

            int color = pickColor(pixels, height, width);
            updateColorData(color);

            Log.i("FRAME PREVIEW", "Color updated");
        } catch (RuntimeException oops) {
            // Do nothing, exception is thrown because onPreviewFrame is called after camera is released
            Log.i("FRAME PREVIEW", "RuntimeException thrown into onPreviewFrame");
        }
    }

如果有影响的话,这里是完整项目的 github 链接:https://github.com/adlebzelaznog/colometer

【问题讨论】:

  • 如果你从 void 更改为 int 然后在方法中添加一个 return 语句,返回值。
  • onPreviewFrame 是来自android.hardware.Camera.PreviewCallback 的回调。不确定您是如何设法将 void 更改为 int 并且您的代码仍然有效

标签: java android


【解决方案1】:

我认为问题在于 onPreviewFrame 是一种由系统/框架而不是您调用的继承方法(假设它是这里提到的方法:http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html)。

在这种情况下,我会保持签名不变,然后将值保存在例如共享首选项,以便您可以在应用程序的其他部分访问颜色值 (http://developer.android.com/reference/android/content/SharedPreferences.html)。

您的代码将如下所示:

public void onPreviewFrame(byte[] data, Camera camera) {

        try {
            Camera.Size previewSize = camera.getParameters().getPreviewSize();
            int height = previewSize.height;
            int width = previewSize.width;

            ColorModelConverter converter = new ColorModelConverter(height, width);
            int[] pixels = converter.convert(data, this.colorFormat);

            int color = pickColor(pixels, height, width);
            updateColorData(color);

            storeColorInSharedPreferences(color); //save variable here

            Log.i("FRAME PREVIEW", "Color updated");
        } catch (RuntimeException oops) {
            // Do nothing, exception is thrown because onPreviewFrame is called after camera is released
            Log.i("FRAME PREVIEW", "RuntimeException thrown into onPreviewFrame");
        }
    }

public void storeColorInSharedPreferences(int color)
{
    //Logic to store color in Shared Preferences
    //Something like this: (not tested!)
    SharedPreferences shared = getSharedPreferences("com.myapp.sharedpreferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = shared.edit();
    editor.putInt("PREVIEW_KEY", color);
    editor.commit();
}

然后在另一个活动中你可以得到这样的值:

SharedPreferences shared = getSharedPreferences("com.myapp.sharedpreferences", MODE_PRIVATE);
int color = (shared.getInt("PREVIEW_KEY", 0));

示例来自:Get Android shared preferences value in activity/normal class

【讨论】:

  • 存储颜色的逻辑是什么意思?
  • 我添加了一个代码示例 - 请在此处查看有关如何在应用程序中获取所需值的更深入说明:stackoverflow.com/questions/2614719/…
  • @NikhilGopal - 这个答案对你有帮助吗?
【解决方案2】:

将方法返回类型更改为int,使签名变为public int onPreviewFrame(byte[] data, Camera camera)

然后,在try 块的末尾,在Log.i("FRAME PREVIEW", "Color updated"); 之后,写上return color;

最后,在整个方法的最后,写return -1;代表一个错误。

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多