Java 在android Studio中直接调用函数还是从类调用函数?
我正在从事两个Android studio项目。 在这两个项目中,我都调用了函数get\u LTE\u Rsrp():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) {
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,你试过吗?这能解决你的问题吗?