【问题标题】:Android | JAVA | Cannot Access Variable returned by a method安卓 |爪哇 |无法访问方法返回的变量
【发布时间】: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() 方法中使用iconFlag

【问题讨论】:

  • getConnection() 返回 null 因为 Ion.with(getApplicationContext()).load(con) 在后台线程上运行。
  • 那我该怎么办?
  • 创建一个接口并将其传递给 getConnection 方法。
  • 很抱歉,请您详细说明一下。我不知道。如果可能的话,请用代码解释一下。您可以发布为答案,然后如果这不起作用,您可以编辑答案。
  • 我已经发布了一个完整的解决方案作为答案。

标签: java android methods


【解决方案1】:

像这样为 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");

            }
        }

    }

【讨论】:

  • 非常感谢@ErselanKhan。此代码按预期工作。但是,如果我想了解这段代码做了什么,那么我应该搜索什么?我是搜索“接口回调”还是“实现接口”或其他内容?
  • 你应该学习“回调函数”
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多