JSON在一个代码中返回数据,在其他代码中返回null

时间:2015-07-24 12:55:34

标签: android json

我有一个应用程序连接到服务器发送sql请求并获得JSON回答为JsonArray。 它的Asynktask在单独的类中(HTTPRequest.java是我的AsyncTask类,Responce.java是我的回调接口类),它的工作正确。

当我在OrderActivity.java中使用它时,如下所示

@Override //my interface class function
public void onPostExecute(JSONArray Result) {
    load(Result);
}

private void load(JSONArray json) {
for(int i=0;i<json.length();i++){
try {
    JSONObject jo = json.getJSONObject(i);
    Product p = new Product(
            jo.getInt("ID"),
            jo.getInt("parent"),
            jo.getInt("category"),
            jo.getString("Item"),
            jo.getDouble("Price")
    );
    products.add(p);

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

它可以正常工作并使用数据填充产品,但当我分配给我的类变量JSONArray json

JSONArray json = new JSONArray;
.
.
.
@Override
public void onPostExecute(JSONArray Result) {
    json = Result;
}

json为null

//HTTPRequest.java
public class HTTPRequest extends AsyncTask<String, Void, Integer> {

private Context context;
private Responce responce;
JSONArray json;

public HTTPRequest(Context context){
    this.context = context;
    responce = (Responce)context;
}

    @Override
protected Integer doInBackground(String... params) {

    OutputStream output;
    InputStream inputStream = null;
    HttpURLConnection connection = null;
    String charset = "UTF-8";
    Integer result = 0;

        try {
            URL uri = new URL(params[0]);
            connection = (HttpURLConnection) uri.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Accept-Charset", charset);
            connection.setRequestProperty("Content-Type", "text/plain; charset=" + charset);
            output = connection.getOutputStream();
            output.write(params[1].getBytes(charset));
            output.close();

            int statusCode = connection.getResponseCode();
            if (statusCode == 200) {
                inputStream = new BufferedInputStream(connection.getInputStream());
                json = new JSONArray(getJSON(inputStream));
                result = 1;
            }
        } catch (Exception e) {
            e.getLocalizedMessage();
        }
        return result;
}

@Override
protected void onPostExecute(Integer i) {
    super.onPostExecute(i);
    if(i == 1) {
        responce.onPostExecute(json);
    } else {
        responce.onPostExecute(null);
    }
}

private String getJSON(InputStream inputStream) throws IOException, JSONException {
    StringBuffer stringBuffer = new StringBuffer();
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
    String line = "";
    String result = null;

    while((line = bufferedReader.readLine()) != null) {
        stringBuffer.append(line.toString());
    }
    result = stringBuffer.toString();

    if(null!=inputStream){
        inputStream.close();
    }
    return result;
}
}

//Responce.java
public interface Responce {
public void onPostExecute(JSONArray Result);
}

//OrderActivity.java
public class OrderActivity extends Activity implements Responce{

ArrayList<Product> products = new ArrayList<Product>();
ProductAdapter productAdapter;
OrderItemAdapter orderItemAdapter;
ListView orderlist;
JSONArray ja;

Button btnBack;
Button btnTakeOrder;
ListView picklist;

HTTPRequest httpRequest;
String url = "http://192.168.3.125:8888/data/";
String query = "select * from vwitems order by category desc";

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

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    orderlist =(ListView)findViewById(R.id.orderlist);
    orderItemAdapter = new OrderItemAdapter(OrderActivity.this);

    btnBack = (Button)findViewById(R.id.btnBack);
    btnBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            productAdapter.filter(0);
        }
    });

    btnTakeOrder = (Button)findViewById(R.id.btnTakeOrder);
    btnTakeOrder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Integer oid = 0;
            Order order = new Order(OrderActivity.this);
            oid = order.NewOrder(1, 2, 3);
            Toast.makeText(OrderActivity.this," " + order.getCount(), LENGTH_SHORT).show();
        }
    });

    orderlist.setAdapter(orderItemAdapter);

    picklist = (ListView) findViewById(R.id.picklist);
    picklist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int pid = 0;
            if (productAdapter.getItem(position).isCategory()) {
                pid = productAdapter.getItem(position).getId();
                productAdapter.filter(pid);
            } else {
                OrderItem oi = new OrderItem();
                oi.setItemId(productAdapter.getItem(position).getId());
                oi.setItem(productAdapter.getItem(position).getItem());
                oi.setPrice(productAdapter.getItem(position).getPrice());
                search(oi);
            }
        }
    });

    httpRequest = new HTTPRequest(this);
    httpRequest.execute(url, query);
}

private boolean search(OrderItem oi){
    int size = orderItemAdapter.getCount();
    int i = 0;
    if(size != 0)
        for(OrderItem o : orderItemAdapter.getAll()){
            if(o.getItemId() == oi.getItemId()){
                orderItemAdapter.getItem(i).setQuantity(orderItemAdapter.getItem(i).getQuantity() + 1);
                orderItemAdapter.notifyDataSetChanged();
                return true;
            }
            i++;
        }

    orderItemAdapter.addItem(oi);
    orderItemAdapter.notifyDataSetChanged();
    return false;
}

private void load(JSONArray json) {

    for(int i=0;i<json.length();i++){
        try {

            JSONObject jo = json.getJSONObject(i);
            Product p = new Product(
                    jo.getInt("ID"),
                    jo.getInt("parent"),
                    jo.getInt("category"),
                    jo.getString("Item"),
                    jo.getDouble("Price")
            );
            products.add(p);

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

    productAdapter = new ProductAdapter(OrderActivity.this, products);
    picklist.setAdapter(productAdapter);

    productAdapter.filter(0);
}

@Override
public void onPostExecute(JSONArray Result) {
    load(Result);
}

/*
@Override
public void onPostExecute(JSONArray Result) {
    json = Result;
}
**/
}
抱歉,我忘了包含这个

//Order.java
public class Order implements Responce{

private Context context;
private JSONArray json = new JSONArray();
private HTTPRequest httpRequest;

private int OrderID;
private Date OrderDate;
private int OrderTable;
private int Waiter;
private byte OrderStatus;
private List<OrderItem> orderItems;

public Order(Context context){
    this.context = context;
}

//some code here...

public Integer NewOrder(Integer guests, Integer waiter, Integer ordertable){
    String query = "insert into orders(orderdate, guests, waiter, ordertable) VALUES(NOW()," + guests + ", " + waiter + ", " + ordertable + "); SELECT LAST_INSERT_ID() as ID;";
    Integer result = 0;
    Connect(query);
    try {
        JSONObject jo = json.getJSONObject(0);
        result = jo.getInt("ID");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return result; //here i got 0 if i init result to 0, null or what ever i init my 
}

@Override
public void onPostExecute(JSONArray Result) {
    json = Result;
}

private void Connect (String query){
    httpRequest = new HTTPRequest(context);
    httpRequest.execute("http://192.168.3.125:8888/data/", query);
}

}

0 个答案:

没有答案