【问题标题】:Volley error in the android studio always response is errorandroid studio中的Volley错误总是响应错误
【发布时间】:2019-03-09 08:21:37
【问题描述】:

我正在做我最后一年的项目,过了一段时间我有演示文稿 但我遇到一个问题,凌空总是以错误响应 这是我的截击代码,下面是完整的活动代码

StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d("---------------->>>", ""+response);
                        OrderConfirmationResponse orderConfirmationResponse = new Gson().fromJson(response, OrderConfirmationResponse.class);

                        if(orderConfirmationResponse.getSuccess()){
                            Toast.makeText(ConfirmOrderActivity.this, "Your order has been placed successfully!",Toast.LENGTH_LONG).show();
                            BasketPref.setBasket(null, ConfirmOrderActivity.this);
                            OrderPref.setOrder(orderConfirmationResponse.getOrder(), ConfirmOrderActivity.this);

                            startActivity(new Intent(ConfirmOrderActivity.this, MenuActivity.class));
                            finish();

                        }else{
                            Toast.makeText(ConfirmOrderActivity.this, "Unable to place your order, please try again later.",Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                   public void onErrorResponse(VolleyError error) {
                        Toast.makeText(ConfirmOrderActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                    }

下面的截图吐司区域显示错误

这是完整的活动代码,如果我可以为您提供更多信息,请告诉我

 package com.jazib.otrack;

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.jazib.otrack.model.OrderConfirmationResponse;
import com.jazib.otrack.model.OrderHistory;
import com.jazib.otrack.model.OrderHistoryResponse;
import com.jazib.otrack.model.User;
import com.jazib.otrack.network.HistoryRequest;
import com.jazib.otrack.pref.BasketPref;
import com.jazib.otrack.pref.LocationPref;
import com.jazib.otrack.pref.OrderPref;
import com.jazib.otrack.pref.UserPref;
import com.jazib.otrack.utility.Config;
import com.jazib.otrack.utility.Utility;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.nlopez.smartlocation.OnLocationUpdatedListener;
import io.nlopez.smartlocation.SmartLocation;

public class ConfirmOrderActivity extends AppCompatActivity {
    String deal_id,deal_name,quantity,price,customer_id;


    //private SharedPreferences sp;
    private static final String REGISTER_URL = Config.BASE_URL+"order_enter.php";


    public static final String KEY_DEALID = "deal_id";
    public static final String KEY_DEAL_NAME = "deal_name";
    public static final String KEY_DEALI_QUANTITY= "quantity";
    public static final String KEY_DEAL_TOTAL = "price";
    public static final String KEY_CUSTOMER_ID = "customer_id";


    public static final String KEY_CUSTOMER_LAT = "lat";
    public static final String KEY_CUSTOMER_LNG = "lng";

    private User user;
    private Utility utility;
    private Context ctx;
    private Location mLocation;

    private TextView tvMessage;

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

        utility = new Utility();
        ctx = ConfirmOrderActivity.this;

        Intent intent = getIntent();
        price = intent.getStringExtra("dtotalprice");
       // Toast.makeText(ConfirmOrderActivity.this,price,Toast.LENGTH_LONG).show();

        final Button btnaddress = (Button) findViewById(R.id.btnaddress);
        final Button btnorder = (Button) findViewById(R.id.btnorder);
        tvMessage = (TextView) findViewById(R.id.textViewMessage);


        btnaddress.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Intent i = new Intent(ConfirmOrderActivity.this, ChangeAddressActivity.class);
                ConfirmOrderActivity.this.startActivity(i);


            }
        });

        btnorder.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (Utility.isNetworkAvailable(ConfirmOrderActivity.this)) {
                    confirmOrder();
                }else{
                    Utility.showToast("No Internet Connection.", ConfirmOrderActivity.this);
                }
            }
        });

        getHistory(UserPref.getUser(ctx).getId());

        initLocation();
    }

    @Override
    public void onResume(){
        super.onResume();


        //Show default address
        setDefaultAddress();
    }


    private void setDefaultAddress(){
        User user = UserPref.getUser(ConfirmOrderActivity.this);
        ((TextView) findViewById(R.id.addressConfirmation_addressTextView)).setText(user.getAddress());
        ((TextView) findViewById(R.id.addressConfirmation_cityTextView)).setText(user.getCity());
        ((TextView) findViewById(R.id.addressConfirmation_phoneTextView)).setText(user.getPhone());
    }


    private void confirmOrder(){
        user = UserPref.getUser(ConfirmOrderActivity.this);

        Intent intent = getIntent();
        deal_id = intent.getStringExtra("did");
        deal_name = intent.getStringExtra("dname");
        quantity= intent.getStringExtra("dquantity");
        price = intent.getStringExtra("dtotalprice");

        customer_id = user.getId();


        StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d("---------------->>>", ""+response);
                        OrderConfirmationResponse orderConfirmationResponse = new Gson().fromJson(response, OrderConfirmationResponse.class);

                        if(orderConfirmationResponse.getSuccess()){
                            Toast.makeText(ConfirmOrderActivity.this, "Your order has been placed successfully!",Toast.LENGTH_LONG).show();
                            BasketPref.setBasket(null, ConfirmOrderActivity.this);
                            OrderPref.setOrder(orderConfirmationResponse.getOrder(), ConfirmOrderActivity.this);

                            startActivity(new Intent(ConfirmOrderActivity.this, MenuActivity.class));
                            finish();

                        }else{
                            Toast.makeText(ConfirmOrderActivity.this, "Unable to place your order, please try again later.",Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
//                    @Override
//                    public void onErrorResponse(VolleyError error) {
//                        Toast.makeText(ConfirmOrderActivity.this,error.toString(),Toast.LENGTH_LONG).show();
//                    }
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(ConfirmOrderActivity.this,"Slow Internet issue,try again later",Toast.LENGTH_LONG).show();
                        }
                }){
            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<String, String>();
                params.put(KEY_DEALID,deal_id);
                params.put(KEY_DEAL_NAME,deal_name);
                params.put(KEY_DEALI_QUANTITY, quantity);
                params.put(KEY_DEAL_TOTAL, price);
                params.put(KEY_CUSTOMER_ID, customer_id);
                params.put(KEY_CUSTOMER_LAT, ""+mLocation.getLatitude());
                params.put(KEY_CUSTOMER_LNG, ""+mLocation.getLongitude());



                return params;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    /************
     ************/
    private void getHistory(String id) {
        utility.showProgressDialog(ctx);
        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                utility.hideProgressDialog(ctx);
                try {
                    Log.d("== updateOrderStatus >>", "" + response);
                    OrderHistoryResponse orderResponse = new Gson().fromJson(response, OrderHistoryResponse.class);
                    if (orderResponse.getSuccess()) {
                        if(isOrderPending(orderResponse.getHistory())){
                            //Utility.showToast("You have a under process order, please complete that first.", ctx);
                            findViewById(R.id.btnorder).setVisibility(View.INVISIBLE);
                            tvMessage.setVisibility(View.VISIBLE);
                            tvMessage.setText("You have a under process order, please complete that first.");
                        }else{
                            findViewById(R.id.btnorder).setVisibility(View.VISIBLE);
                            tvMessage.setVisibility(View.GONE);
                        }
                    } else {
                        Utility.showToast("Something went wrong, please try again.", ctx);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                utility.hideProgressDialog(ctx);
                Toast.makeText(ctx, error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
            }
        };

        HistoryRequest orderRequest = new HistoryRequest(id, responseListener, errorListener);
        RequestQueue queue = Volley.newRequestQueue(ctx);
        orderRequest.setRetryPolicy(new DefaultRetryPolicy(10000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(orderRequest);
    }

    private boolean isOrderPending(List<OrderHistory> ordersList){
        for(OrderHistory orderHistory : ordersList){
            if(orderHistory.getStatusCode() == 0 || orderHistory.getStatusCode() == 1){
                return true;
            }
        }

        return false;
    }


    /********
     Location
     ********/
    private void initLocation() {
        SmartLocation.with(ctx).location().start(new OnLocationUpdatedListener() {
            @Override
            public void onLocationUpdated(Location location) {
                Log.d("***LOCATION***", "" + location.getLatitude() + " <---> " + location.getLongitude());
                mLocation = location;
                LocationPref.setLocation(location, ctx);



            }
        });
    }

}

【问题讨论】:

  • 你确定这就是全部代码吗?你有堆栈跟踪吗?在 null 对象上调用 getLatitude 方法。检查该对象并查看它是否已正确初始化。
  • 我已经添加了完整的代码
  • 你在onLocationUpdated() 方法中得到location 值吗?也粘贴堆栈跟踪。根据您的代码,看起来 mLocationlocation 为空。
  • 在某些手机上可以正常工作,在某些手机上会出现错误
  • 所以您的意思是在某些手机上您会看到 onLocationUpdated 方法被调用,而在某些手机上却没有。这些是设备还是模拟器?它们是否处于相同的测试条件。他们有sim卡吗?它们的网络配置是否不同,例如连接到 wifi 或数据?

标签: android runtime-error android-volley


【解决方案1】:

我不确定您的"import io.nlopez.smartlocation.SmartLocation;" 做了什么,但可以从设备获取空位置。如果您的设备可以在您的应用运行时尝试禁用定位服务,看看您是否可以重现它。

查看:https://developer.android.com/training/location/retrieve-current

location对象在以下情况下可能为null:

  • 位置在设备设置中被关闭。
  • 即使先前检索到最后一个位置,结果也可能为 null,因为禁用位置也会清除缓存。
  • 设备从未记录其位置,可能是新设备或已恢复出厂设置的设备。
  • 设备上的 Google Play 服务已重新启动,并且在服务重新启动后没有活动的 Fused Location Provider 客户端请求位置。为避免这种情况,您可以创建一个新客户端并自己请求位置更新。有关详细信息,请参阅接收位置更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多