使用JSON对象的Android Studio中的Volley库错误

沙玛先生

我创建了一个删除地址类

public class DeleteAddress {
    boolean result = false;
    String addressid;

    public boolean delAddress(Context context, final int id){

        addressid = Integer.toString(id);

        StringRequest stringRequest = new StringRequest(
                Request.Method.POST,
                Constants.URL_DELETE_ADDRESS,
                new com.android.volley.Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        try {

                            JSONObject jsonObject = new JSONObject(response);
                            if(jsonObject.getBoolean("error")){
                                result = false;
                            }
                            else {
                                result = true;
                            }


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        System.out.println(error.getMessage());
                        result = false;
                    }
                }

        ){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("id", addressid);
                return params;
            }

        };

        RequestHandler.getInstance(context).addToRequestQueue(stringRequest);

        return result;
    }
}

地址适配器的代码

public class AddressAdapter extends RecyclerView.Adapter<AddressHolder>{
    private ArrayList<Address> dataList;
    Context context;
    int id;
    
    DeleteAddress deleteAddress = new DeleteAddress();

    public AddressAdapter(Context context, ArrayList<Address> list){
        this.context = context;
        this.dataList= list;
    }

    @NonNull
    @Override
    public AddressHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.row, parent, false);
        return new AddressHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull AddressHolder holder, int position) {
        holder.bind(dataList.get(position));
        id = holder.getAddressId(dataList.get(position));


        holder.deleteAddress.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
                alertDialogBuilder.setMessage("Are you sure you want to delete this address?");
                alertDialogBuilder.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface arg0, int arg1) {
                                //dummy
                                arg0.cancel();
                                //System.out.println(id);                   working fine
                                if(deleteAddress.delAddress(context, id)){
                                    Toast.makeText(context, "Address record deleted!", Toast.LENGTH_SHORT).show();
                                }
                                else {
                                    Toast.makeText(context, "Some error occurred!", Toast.LENGTH_SHORT).show();
                                }

                                Intent i = new Intent(context, AddressListActivity.class);
                                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                context.startActivity(i);
                            }
                        });

                alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int i) {
                        arg0.cancel();
                    }
                });

                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
}

所以让我解释一下我要做什么。
我做了一个布局,在“地址”活动中显示地址,并且正在显示来自mysql php后端的数据。此活动运行正常。我在回收者视图中添加了两个项目,我们可以使用它们来编辑和删除特定的地址记录。编辑按钮可以正常工作,但删除不起作用。
如果我单击删除按钮,我会收到吐司消息,发生了一些错误。但是,如果我测试按钮2-3次,我会收到相同的消息,但记录将被删除。Web服务运行正常,因此没有问题。
logcat中没有错误。

我不知道怎么回事。有人可以帮忙吗?需要更多的代码部分我可以对其进行更新...

编辑:我发现了错误。在deleteaddress类中,由于某种原因,结果变量的值在String请求方法中未得到更新。我试图从logcat的Web服务中打印消息,它表明该地址已被删除,并且我检查数据库也正在更新,但是我仍然收到吐司消息,指出发生了一些错误。

阿纳托利

onResponse(String response) 是异步方法

result在回调函数中进行更新该方法delAddress始终返回false。(它true在第二次执行时返回,因为result后来被更新了)

您的代码应更改为:

制作新界面

public interface CallbackClass {
    void onSuccess();
    void onFail(String message);
}

更改

public boolean delAddress(Context context, final int id)

public void delAddress(Context context, final int id, CallbackClass callback)

然后

result = false;

可能像

callback.fail("error");

result = true;

可能像

callback.success();

至少

if(deleteAddress.delAddress(context, id)){
    Toast.makeText(context, "Address record deleted!", Toast.LENGTH_SHORT).show();
} else {
    Toast.makeText(context, "Some error occurred!", Toast.LENGTH_SHORT).show();
}

deleteAddress.delAddress(context, id, new CallbackClass(){
    void onSuccess(){
        Toast.makeText(context, "Address record deleted!", Toast.LENGTH_SHORT).show();
    }
    void onFail(String message){
        Toast.makeText(context, "Some error occurred!", Toast.LENGTH_SHORT).show();
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 volley 在 android 中检索 Json 对象

使用Volley在Android中嵌套JSON对象解析

如何使用 volley 库检查 JSON 输出是否与 android studio 中的 JSON 邮递员输出相同。

如何使用Volley库解析android中的嵌套json数组

Android Studio 3.1.3 未找到 Volley 库

如何在android studio中返回或重用Volley库的响应值?

使用 Android VOLLEY 迭代和解析嵌套的 JSON 对象

如何使用Volley库从android studio调用WooCommerce API?

错误:在 Android Studio、Volley 和 ArcMenu 中找不到名称为“default”的配置

PHP从Android studio volley Get请求接收JSON对象

在 Android 应用中使用 Volley 库解析对象数据

使用Volley解析JSON(从选择数据库中)

Android Studio中缺少数据库错误?

尝试在android studio中添加库时发生compileClassPAth错误

使用Volley库的android中Map接口的用途是什么?

如何使用 Volley 库在 android recyclerView 中添加搜索功能

无法在Android Studio中安装或导入Volley

在 Android Studio 3.1.2 中添加 Volley 的问题

使用单行对象结构检索android中的JSON

如何使用Spring for Android在此输出中获取JSON对象

Android Studio 3.0库错误

Android studio 解析json对象

通过Android-Volley获取JSON对象

从Android Studio中的Gitlab克隆存储库时,出现“存储库测试失败”错误?

更改库以修复 Google 应用发布错误;android studio 中的计费库版本 3

在Android Studio中使用GET方法和Volley解析JSON

使用Volley进行Android Studio JSON解析:获取NullPointerException

我在使用volley.android的Android中收到如下错误:org.json.JSONException:索引3超出范围[0..3)

如何在Android中使用Volley将JSON对象发送到服务器