在 android 中进行回调的简单方法 - AndroidX
The simple one to make callback in android - AndroidX
我想弄清楚回调的工作原理和最简单的方法,但我无法解决它
这是我的监听器界面
public interface OnTestingCBListener {
void onSuccessCB(String SomeValue);}
这是我的MainActivity.java
OnCreate(){
//FIRST
deviceSetup();
}
public void deviceSetup() {
String DeviceID = "asdfg";
final String[] FirebaseID = {""};
//SECOND
GetFireBaseIDCall(new OnTestingCBListener() {
@Override
public void onSuccessCB(String ResultValue) {
//FOURTH
FirebaseID[0] = ResultValue;
}
}, "Value1", "Value2");
//FIFTH
Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
}
OnTestingCBListener onTestingCBListener;
public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
if(x.equals("Value1") && y.equals("Value2")) {
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
final String newToken = instanceIdResult.getToken();
Log.d("newToken", "Success :)");
//THIRD
onTestingCBListener.onSuccessCB(newToken);
}
});
Log.d("newToken", "Failed :(");
}
}
不行,有什么解决办法吗?
请确保日志 Log.d("newToken", "Success :)");
已登录 logcat 因此我们确定本地 onTestingCBListener
侦听器的 onSuccessCB()
已被触发。
您的代码的唯一问题是您过早显示 Toast
,并且在 Firebase
回调被调用之前,因此 onTestingCBListener
的 onSucess() 得到在您的 Toast 显示后调用,因此在监听器 onSucess()
中传输 Toast
消息;所以将下面的部分代码更改为
...
//SECOND
GetFireBaseIDCall(new OnTestingCBListener() {
@Override
public void onSuccessCB(String ResultValue) {
//FOURTH
FirebaseID[0] = ResultValue;
//FIFTH
Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
}
}, "Value1", "Value2");
...
另请注意,Firebase
正在后台线程中工作,因此需要一段时间才能将数据返回到 activity。
按照以下步骤操作:
首先,您必须 activity 扩展回调接口,例如:
public class MainActivity extends AppCompatActivity(), OnTestingCBListener {
然后在您的 activity 中实现该接口的所有未实现功能。
然后创建该接口的对象并在 Activity 的 onCreate() 中初始化它,例如:
OnTestingCBListener onTestingCBListener;
在 onCreate() 中将其初始化为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onTestingCBListener = this
}
然后随时调用它的函数,例如:
onTestingCBListener.onSuccessCB(newToken);
问题已解决,需要先初始化监听器
final OnTestingCBListener onTestingCBListener;
public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
if(x.equals("Value1") && y.equals("Value2")) {
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
final String newToken = instanceIdResult.getToken();
Log.d("newToken", "Success :)");
//This is the problem!!
onTestingCBListener = onTestingCBListener;
//THIRD
onTestingCBListener.onSuccessCB(newToken);
}
});
Log.d("newToken", "Failed :(");
}
}
我想弄清楚回调的工作原理和最简单的方法,但我无法解决它
这是我的监听器界面
public interface OnTestingCBListener {
void onSuccessCB(String SomeValue);}
这是我的MainActivity.java
OnCreate(){
//FIRST
deviceSetup();
}
public void deviceSetup() {
String DeviceID = "asdfg";
final String[] FirebaseID = {""};
//SECOND
GetFireBaseIDCall(new OnTestingCBListener() {
@Override
public void onSuccessCB(String ResultValue) {
//FOURTH
FirebaseID[0] = ResultValue;
}
}, "Value1", "Value2");
//FIFTH
Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
}
OnTestingCBListener onTestingCBListener;
public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
if(x.equals("Value1") && y.equals("Value2")) {
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
final String newToken = instanceIdResult.getToken();
Log.d("newToken", "Success :)");
//THIRD
onTestingCBListener.onSuccessCB(newToken);
}
});
Log.d("newToken", "Failed :(");
}
}
不行,有什么解决办法吗?
请确保日志 Log.d("newToken", "Success :)");
已登录 logcat 因此我们确定本地 onTestingCBListener
侦听器的 onSuccessCB()
已被触发。
您的代码的唯一问题是您过早显示 Toast
,并且在 Firebase
回调被调用之前,因此 onTestingCBListener
的 onSucess() 得到在您的 Toast 显示后调用,因此在监听器 onSucess()
中传输 Toast
消息;所以将下面的部分代码更改为
...
//SECOND
GetFireBaseIDCall(new OnTestingCBListener() {
@Override
public void onSuccessCB(String ResultValue) {
//FOURTH
FirebaseID[0] = ResultValue;
//FIFTH
Toast.makeText(MainActivity.this, "Result: "+DeviceID+"#"+FirebaseID, Toast.LENGTH_LONG).show();
}
}, "Value1", "Value2");
...
另请注意,Firebase
正在后台线程中工作,因此需要一段时间才能将数据返回到 activity。
按照以下步骤操作:
首先,您必须 activity 扩展回调接口,例如:
public class MainActivity extends AppCompatActivity(), OnTestingCBListener {
然后在您的 activity 中实现该接口的所有未实现功能。
然后创建该接口的对象并在 Activity 的 onCreate() 中初始化它,例如:
OnTestingCBListener onTestingCBListener;
在 onCreate() 中将其初始化为:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onTestingCBListener = this }
然后随时调用它的函数,例如:
onTestingCBListener.onSuccessCB(newToken);
问题已解决,需要先初始化监听器
final OnTestingCBListener onTestingCBListener;
public void GetFireBaseIDCall(OnTestingCBListener onTestingCBListener, String x, String y){
if(x.equals("Value1") && y.equals("Value2")) {
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
final String newToken = instanceIdResult.getToken();
Log.d("newToken", "Success :)");
//This is the problem!!
onTestingCBListener = onTestingCBListener;
//THIRD
onTestingCBListener.onSuccessCB(newToken);
}
});
Log.d("newToken", "Failed :(");
}
}