【问题标题】:OkHttpClient throws an error when trying to load data from sharedPrefrencesOkHttpClient 在尝试从 sharedPrefrences 加载数据时抛出错误
【发布时间】:2021-09-15 18:07:54
【问题描述】:

我正在制作一个控制 esp 模块的应用程序,并且我正在使用 OkHttpClient 来发出 web 请求。 您可以在设置选项卡中设置 esp 模块的 ip(例如,如果您的 esp ip 是 123.456.789,则 Web 请求的 url 将是 http://123.456.789),我正在保存、加载和从我的设置活动中获取该数据使用 sharedPrefrences 到我的主要活动,但是当我打开应用程序时,它只是崩溃并显示错误 url == null。

我让它工作的唯一方法是如果我像这样加载它:

public String ip = SettingsActivity.ipEsp;

但是每次我重新打开应用程序时,我都必须打开要加载的数据的设置活动。(尝试使用 sharedPrefrences 保存此值,但它似乎不起作用,它不会崩溃或任何它不起作用的东西)

我希望以某种方式保存它,这样每当我重新打开应用程序时,它就会记住我在设置中设置的 IP 地址。

这是主要的活动代码:

   public class MainActivity extends AppCompatActivity {

    Button settings;
    Button send;
    TextView view;
    TextView see;
    public String urlS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        settings = (Button) findViewById(R.id.button);
        send = (Button) findViewById(R.id.button2);
        view = (TextView) findViewById(R.id.textView);
        see = (TextView) findViewById(R.id.see);

        SharedPreferences urls = getSharedPreferences("sPrefs", MODE_PRIVATE);

        urlS = urls.getString("url", "http://0.0.0.0:8888");





        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

            client.newCall(requestlL).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (response.isSuccessful()){
                        String myR = response.body().string();

                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                see.setText(myR);
                            }
                        });
                    }
                }
            });

                view.setText(urlS);
            }




        }
        );


        settings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            setting();
            }
        });



    }


    OkHttpClient client = new OkHttpClient();

    String urllL = urlS;

    Request requestlL = new Request.Builder()
            .url(urllL)
            .build();


    public void setting() {
        Intent intent = new Intent(this, MainActivity2.class);
        startActivity(intent);
    }

}

这是设置活动代码:

public class MainActivity2 extends AppCompatActivity {

private Handler sHand = new Handler();
public static final String S_PREFS = "sPrefs";
public static final String URL = "url";

Button back;
Button save;
EditText url;


public String urlS;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);
    back = (Button) findViewById(R.id.button3);
    save = (Button) findViewById(R.id.button4);
    url = (EditText) findViewById(R.id.edit);


    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            back();
        }
    });


    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            urlS = url.getText().toString();
            save();

        }
    });


    load();
    view();



}

public void back()
{
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
}




public void saveDataRunS()
{
    sHand.post(saveDs);
}

private Runnable saveDs= new Runnable() {
    @Override
    public void run() {
        save();
        load();

        sHand.postDelayed(this, 1);


    }

};





public void save()
{
    SharedPreferences sharedPreferences = getSharedPreferences("sPrefs", MODE_PRIVATE);
    SharedPreferences.Editor edit = sharedPreferences.edit();

    edit.putString(URL, url.getText().toString());

    edit.apply();
}

public void load()
{
    SharedPreferences sharedPreferences = getSharedPreferences(S_PREFS, MODE_PRIVATE);
    urlS = sharedPreferences.getString(URL, "http://0.0.0.0:8888");

}

public void view()
{
    url.setText(urlS);

}

}

这是我得到的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.test, PID: 18146
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException: url == null
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3222)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3437)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2041)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7386)
    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:980)
 Caused by: java.lang.NullPointerException: url == null
    at okhttp3.Request$Builder.url(Request.java:132)
    at com.example.test.MainActivity.<init>(MainActivity.java:99)
    at java.lang.Class.newInstance(Native Method)
    at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
    at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1250)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3210)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3437) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2041) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7386) 
    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:980) 

【问题讨论】:

  • 坦率地说,这比这里任何人实际看到的代码都要多。您应该创建一个小示例来说明问题。这可能会让您自己也发现问题的根源。似乎问题与 http 客户端无关,而与存储和检索共享首选项有关。所以,我的建议 - 编写一个单独的示例应用程序,只存储和检索共享首选项。完成该工作后,将该代码放入您的主应用程序中。
  • @GreyBeardedGeek 我按照您的建议制作了一个应用程序,但发生了同样的错误,我还用示例应用程序更新了我的帖子,因此代码更少。

标签: java android http okhttp esp32


【解决方案1】:

@leeo6002 在 MainActivity2 中,以下列方式调用 save() 方法。 onCreate -> saveDataRunS ->sHand.post(saveDs) -> save -> edit.putString(URL, url.getText().toString());

基本上,一旦触发了活动的 onCreate,您就会从 url editText 获取值。这意味着您无需等待用户在 EditText 中输入值。至少,这是问题之一。

老实说,你需要清理你的代码,现在很乱。

【讨论】:

  • 我对其进行了更改,因此仅在按下保存按钮时才调用 save() 方法,并且我用我对代码所做的更改编辑了帖子,但我仍然遇到相同的错误。
  • 尝试将以下代码放入 MainActivity 中发送按钮的 onClick 中。缩小问题范围的方法 OkHttpClient client = new OkHttpClient();字符串 urlL = urlS;请求 requestlL = new Request.Builder() .url(urlL) .build();
  • 好的,这可以解决我一半的问题,因为在我的原始代码中,有一个函数不断运行以从 Web 服务器读取数据,因此我无法使用按钮构建 url点击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多