You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Volley将Spinner值POST到数据库?求代码实现指导

嘿,我来帮你搞定这个问题!要把Spinner的选中值通过POST提交到数据库,咱们分两步走:先把Spinner的选中值存成全局变量方便调用,再实现POST请求发送参数。

第一步:获取Spinner的全局选中值

你现在的代码里,选中值只在监听器内部可用,咱们把它们改成Activity的全局变量,这样点击按钮的时候就能轻松拿到:

首先,在FormActivity类里定义几个全局变量:

public class FormActivity extends AppCompatActivity implements View.OnClickListener {
    // 定义全局变量存储每个Spinner的选中值
    private String selectedStudy;
    private String selectedCity;
    private String selectedUniversity;
    private String selectedUnited;
    
    // 你的其他代码(比如Spinner、Button的声明)...

然后修改每个Spinner的监听器,把选中值赋值给对应的全局变量:

spinnerStudy.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        selectedStudy = spinnerStudy.getSelectedItem().toString();
        if(!selectedStudy.isEmpty()){
            Toast.makeText(getApplicationContext(), selectedStudy, Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {}
});

// 其他三个Spinner的监听器同理修改:
spinnerCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        selectedCity = spinnerCity.getSelectedItem().toString();
        if(!selectedCity.isEmpty()) {
            Toast.makeText(getApplicationContext(), selectedCity, Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {}
});

// spinnerUniversity和spinnerUnited的监听器也按照上面的方式修改,把选中值赋值给对应的全局变量

第二步:实现POST请求提交参数

咱们用Android里常用的OkHttp库来发送POST请求,这比原生的HttpURLConnection更简洁好用。

1. 添加OkHttp依赖

在你的app/build.gradle(Module级别)的dependencies块里添加:

implementation 'com.squareup.okhttp3:okhttp:4.10.0'

然后同步Gradle项目。

2. 在按钮点击事件里发送POST请求

修改你的按钮点击逻辑,收集全局变量里的选中值,构建POST请求发送到服务器:

@Override
public void onClick(View v) {
    if (v.getId() == R.id.button) {
        // 先检查所有选项是否都已选择
        if (selectedStudy.isEmpty() || selectedCity.isEmpty() || selectedUniversity.isEmpty() || selectedUnited.isEmpty()) {
            Toast.makeText(this, "请选择所有选项哦", Toast.LENGTH_SHORT).show();
            return;
        }

        // 1. 创建OkHttp客户端
        OkHttpClient client = new OkHttpClient();

        // 2. 构建POST请求的表单参数
        RequestBody formBody = new FormBody.Builder()
                .add("study", selectedStudy) // 参数名要和服务器接口要求的一致
                .add("city", selectedCity)
                .add("university", selectedUniversity)
                .add("united", selectedUnited)
                .build();

        // 3. 构建请求对象,替换成你的服务器接口地址
        Request request = new Request.Builder()
                .url("http://你的服务器地址/接口路径") // 比如 http://192.168.1.100:8080/saveData
                .post(formBody)
                .build();

        // 4. 异步发送请求(不能在主线程发网络请求哦)
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 请求失败时,回到主线程提示用户
                runOnUiThread(() -> Toast.makeText(FormActivity.this, "提交失败:" + e.getMessage(), Toast.LENGTH_SHORT).show());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    // 请求成功,获取服务器返回的内容
                    String responseMsg = response.body().string();
                    runOnUiThread(() -> Toast.makeText(FormActivity.this, "提交成功!" + responseMsg, Toast.LENGTH_SHORT).show());
                } else {
                    runOnUiThread(() -> Toast.makeText(FormActivity.this, "提交失败,服务器返回错误", Toast.LENGTH_SHORT).show());
                }
            }
        });
    }
}

几个重要的注意事项

  • 添加网络权限:在AndroidManifest.xml里加上这句,不然App没法访问网络:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 明文HTTP限制:如果你的服务器用的是HTTP(不是HTTPS),在Android 9及以上系统默认会被阻止。可以在res/xml下创建network_security_config.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    然后在AndroidManifest.xml的application标签里配置:
    android:networkSecurityConfig="@xml/network_security_config"
    
    不过生产环境建议用HTTPS哦,更安全。
  • 参数名要匹配:FormBody.Builder里的参数名(比如"study")一定要和你的服务器接口接收的参数名完全一致,不然服务器拿不到数据。

内容的提问来源于stack exchange,提问作者Haj Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:14