【发布时间】:2021-07-15 23:27:09
【问题描述】:
我有一个 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];
}
如您所见,我打印了日志,如果i==1 将打印value[0]。我设置了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 进行比较。我无法在onRequestPermissionsResult() 方法中使用i 或conFlag。
【问题讨论】:
-
getConnection() 返回 null 因为 Ion.with(getApplicationContext()).load(con) 在后台线程上运行。
-
那我该怎么办?
-
创建一个接口并将其传递给 getConnection 方法。
-
很抱歉,请您详细说明一下。我不知道。如果可能的话,请用代码解释一下。您可以发布为答案,然后如果这不起作用,您可以编辑答案。
-
我已经发布了一个完整的解决方案作为答案。