Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android Studio中直接调用函数还是从类调用函数?_Java_Android - Fatal编程技术网

Java 在android Studio中直接调用函数还是从类调用函数?

Java 在android Studio中直接调用函数还是从类调用函数?,java,android,Java,Android,我正在从事两个Android studio项目。 在这两个项目中,我都调用了函数get\u LTE\u Rsrp(): int get_LTE_Rsrp() { try { Method[] methods = android.telephony.SignalStrength.class.getMethods(); for (Method mthd : methods) {

我正在从事两个Android studio项目。 在这两个项目中,我都调用了函数get\u LTE\u Rsrp():

int get_LTE_Rsrp() {
      try {
            Method[] methods = android.telephony.SignalStrength.class.getMethods();

                    for (Method mthd : methods) {
                        if (mthd.getName().equals(LTE_RSRP_STRENGTH)) {   //(TAG)LTE_RSRP_STRENGTH ="getLteRsrp" which is a method inside the SignalStrength.java class
                            int LteRsrpStrength = (Integer) mthd.invoke(signalStrength, new Object[]{});
                            return LteRsrpStrength;
                        }
                    }
                } catch (Exception e) {
                    Log.e(LTE_TAG, "Exception: " + e.toString());
                }
                return 1;   //some default value
            }
在第一个项目中,按以下方式调用它

onCreate {

    // some code

    telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    final PhoneStateListener mListener = new PhoneStateListener() {

        @Override

        public void onSignalStrengthsChanged(SignalStrength sStrength) {

            signalStrength = sStrength;

            mRSRP = get_LTE_Rsrp();

            //display mRSRP in a textview

        }
    }
}
现在,在第二个项目中,我创建了一个名为CellularSignalInfo的类,并将get\u LTE\u Rsrp()作为其方法之一。

CellularSignalInfo的实现


    class CellularSignalInfo {

        final static String LTE_RSRP_STRENGTH = "getLteRsrp";

        SignalStrength signalStrength;
        int cRSRP;

        public int get_LTE_Rsrp() {
            try {

                Log.d("TAG1", "inside LTE RSRP");
                Method[] methods = android.telephony.SignalStrength.class.getMethods();

                for (Method mthd : methods) {
                    Log.d("TAG2", "inside for");
                    if (mthd.getName().equals(LTE_RSRP_STRENGTH)) {
                        Log.d("TAG3", "inside if");
                        int LteRsrpStrength = (Integer) mthd.invoke(signalStrength, new Object[]{});
                        return LteRsrpStrength;
                    }
                }
            } catch (Exception e) {
                Log.e(LTE_TAG, "Exception: " + e.toString());
                Log.d("TAG4", "inside catch");

            }

            return 1;
        }
    }
现在,

int-LteRsrpStrength=(整数)mthd.invoke(信号强度,新对象[]{}); 返回滤波器的强度

这一行代码在第一个项目中工作(并返回一个相应的值,比如-111 dBm) 但在第二种情况下,只返回默认值。我已经尝试在for、if、catch中添加日志,这表明代码确实执行到了该点,但是特定的代码行没有执行


这个问题背后的原因可能是什么?

实际上,您没有在
CellularSignalInfo
内部初始化
信号强度。更改
CellularSignalInfo
如下所示:

class CellularSignalInfo {

    SignalStrength signalStrength;
    int cRSRP;
    final static String LTE_RSRP_STRENGTH = "getLteRsrp";

    public CellularSignalInfo(SignalStrength sStrength) {
        signalStrength = sStrength;
    }

    public int get_LTE_Rsrp() {
        try {

            Log.d("TAG1", "inside LTE RSRP");
            Method[] methods = android.telephony.SignalStrength.class.getMethods();

            for (Method mthd : methods) {
                Log.d("TAG2", "inside for");
                if (mthd.getName().equals(LTE_RSRP_STRENGTH)) {
                    Log.d("TAG3", "inside if");
                    int LteRsrpStrength = (Integer) mthd.invoke(signalStrength, new Object[]{});
                    return LteRsrpStrength;
                }
            }
        } catch (Exception e) {
            Log.e(LTE_TAG, "Exception: " + e.toString());
            Log.d("TAG4", "inside catch");

        }
        return 1;
    }
}
CellularSignalInfo cellularSignalInfo = new CellularSignalInfo(sStrength);
mRSRP = cellularSignalInfo.get_LTE_Rsrp();
然后像下面这样打电话:

class CellularSignalInfo {

    SignalStrength signalStrength;
    int cRSRP;
    final static String LTE_RSRP_STRENGTH = "getLteRsrp";

    public CellularSignalInfo(SignalStrength sStrength) {
        signalStrength = sStrength;
    }

    public int get_LTE_Rsrp() {
        try {

            Log.d("TAG1", "inside LTE RSRP");
            Method[] methods = android.telephony.SignalStrength.class.getMethods();

            for (Method mthd : methods) {
                Log.d("TAG2", "inside for");
                if (mthd.getName().equals(LTE_RSRP_STRENGTH)) {
                    Log.d("TAG3", "inside if");
                    int LteRsrpStrength = (Integer) mthd.invoke(signalStrength, new Object[]{});
                    return LteRsrpStrength;
                }
            }
        } catch (Exception e) {
            Log.e(LTE_TAG, "Exception: " + e.toString());
            Log.d("TAG4", "inside catch");

        }
        return 1;
    }
}
CellularSignalInfo cellularSignalInfo = new CellularSignalInfo(sStrength);
mRSRP = cellularSignalInfo.get_LTE_Rsrp();

在第二种方法中,您是如何将
signalStrength
传递给
CellularSignalInfo
的?添加
CellularSignalInfo
的详细实现为什么需要使用反射来调用类
SignalStrength
中的方法?@shubham,编辑您的帖子并添加
CellularSignalInfo
,因为每次信号强度发生变化时都需要更新该值,因此,反射被用来在运行时调用该方法。@Shubham,你试过吗?这能解决你的问题吗?