我有一个 arduino 系统,它在浏览“10.0.0.1/connection”时发回“1”。我将该“1”存储到一个名为“value”的变量中,并在另一种方法中访问它。在另一种方法中访问值时,它会给出空指针异常。
说明:
这是加载 url 并将我收到的任何源代码存储到变量中的方法。
public String getConnection()
{
String []value = new String[1];
String con = "http://10.0.0.1/connection";
Ion.with(getApplicationContext()).load(con).asString().setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
int i = Integer.parseInt(result);
conFlag = i;
tv.setText(result);
tv.setVisibility(View.VISIBLE);
if(i == 1){
value[0] = result;
Log.d("vol ",value[0]);
}
}
});
return value[0];
}
这里如您所见,我打印了日志,如果 value[0]
将打印 i==1
。我设置了 conFlag = i
。
这里我得到的是 getConnection()
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
Log.d("onRequestPermissionsResult() ->", " called");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
Log.d("onRequestPermissionsResult() ->", " requestCode = 1");
if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//do your thing
info = wifiManager.getConnectionInfo();
if (info.getSSID().trim().equals(ssid)){
String conct = getConnection();
Log.d("vol conct", conct);
if (conFlag == 1){
startActivity(new Intent(SplashScreen.this,MainActivity.class));
}
}
else {
Log.d("Value","Not found");
}
Log.d("onRequestPermissionsResult() ->", " Permissions Granted");
}
}
}
这里我在“Log.d("vol conct", conct);”上得到了 nullPointer 的异常。 日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ims_temp_1, PID: 6670
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.ims_temp_1/com.example.ims_temp_1.SplashScreen}: java.lang.NullPointerException: println needs a message
at android.app.ActivityThread.deliverResults(ActivityThread.java:5143)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5184)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:100)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2222)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:228)
at android.app.ActivityThread.main(ActivityThread.java:7782)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
Caused by: java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.d(Log.java:155)
at com.example.ims_temp_1.SplashScreen.onRequestPermissionsResult(SplashScreen.java:88)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8458)
at android.app.Activity.dispatchActivityResult(Activity.java:8308)
如果我不调用方法 getConnection()
并且不使用它的返回值,那么它会将 value[0]
的日志打印为 1
。这意味着我收到的任何字符串都被解析为 int 并与 int 1
进行比较。我无法在 i
方法中使用该 conFlag
或 onRequestPermissionsResult()
。
答案 0 :(得分:0)
像这样为 Result 创建一个接口:
public interface ResultCallback {
public void result(String value);
}
像这样更新你的 getConnection 方法:
public void getConnection(ResultCallback callback)
{
String []value = new String[1];
String con = "http://10.0.0.1/connection";
Ion.with(getApplicationContext()).load(con).asString().setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
int i = Integer.parseInt(result);
conFlag = i;
tv.setText(result);
tv.setVisibility(View.VISIBLE);
if(i == 1){
value[0] = result;
Log.d("vol ",value[0]);
callback.result(value[0]);
}
}
});
}
和你的 onRequestPermissionsResult 像这样:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
Log.d("onRequestPermissionsResult() ->", " called");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
Log.d("onRequestPermissionsResult() ->", " requestCode = 1");
if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//do your thing
info = wifiManager.getConnectionInfo();
if (info.getSSID().trim().equals(ssid)){
getConnection(new ResultCallback() {
@Override
public void result(String value) {
Log.d("vol conct", value);
if (conFlag == 1){
startActivity(new Intent(SplashScreen.this,MainActivity.class));
}
}
});
}
else {
Log.d("Value","Not found");
}
Log.d("onRequestPermissionsResult() ->", " Permissions Granted");
}
}
}