Я пытаюсь получить java-объект «Product» из ответа json, ответ json возвращает только одну строку из таблицы, и я не знаю, придется ли мне использовать JSONObject или JSONArray или оба, в любом случае пробовал оба, но это не работает, это дает мне исключение NullPointerException.
Вот мой код:
public class ConsultProductActivity extends AppCompatActivity {
String idProduit;
Product prod;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Bundle extra = intent.getExtras();
idProduit = extra.getString("idProduit");
Toast.makeText(ConsultProductActivity.this, idProduit, Toast.LENGTH_SHORT).show();
setContentView(R.layout.activity_consult_product);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_rest);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
prod = prepareFullInfo();
getSupportActionBar().setTitle(prod.getName());
ImageView imgAvant = (ImageView) findViewById(R.id.img_avant);
Glide.with(ConsultProductActivity.this).load(prod.getImg_avant()).into(imgAvant);
ImageView imgArriere = (ImageView) findViewById(R.id.img_arriere);
Glide.with(ConsultProductActivity.this).load(prod.getImg_arriere()).into(imgArriere);
ImageView imgCote = (ImageView) findViewById(R.id.img_cote);
Glide.with(ConsultProductActivity.this).load(prod.getImg_coté()).into(imgCote);
TextView prix = (TextView) findViewById(R.id.prix_consult_p);
prix.setText(prod.getPrice());
AppCompatTextView description = (AppCompatTextView) findViewById(R.id.description);
description.setText(prod.getDescription());
}
public Product prepareFullInfo() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
String productUrl = new String("http://moodyinformatics.000webhostapp.com/product_full_info.php?id=" + idProduit);@Override
protected Void doInBackground(Void... params) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(productUrl).build();try {
Response response = client.newCall(request).execute();
JSONArray array = new JSONArray(response.body().string());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
prod = new Product(object.getInt("id_produit"), object.getString("nom"), object.getString("description"), object.getInt("qte_stock"), object.getInt("prix"), object.getString("img_avant"), object.getString("img_arriere"), object.getString("img_cote"));
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
};
task.execute();
return prod;
}
Мой php файл:
<?php
header('Content-Type: application/json; Charset=UTF-8');
require "conn.php";
$id_produit=$_GET['id'];
$sql = "select p.id_produit, p.nom, p.description, p.prix, p.qte_stock, a.img_avant, a.img_arriere, a.img_cote from produit p, album_photos a where p.id_produit='".$id_produit."' and p.id_produit= a.id_produit";
$response = array();
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)){
$array[]= $row;
}
$jsn= json_encode($array, JSON_UNESCAPED_UNICODE);
$jsn1 = str_replace('\/', '/', $jsn);
$jsn1 = str_replace('\r\n', ' ', $jsn1);
$jsn1= str_replace('images/', 'http://moodyinformatics.000webhostapp.com/images/', $jsn1);
echo $jsn1;
mysqli_close($conn);
?>
ответ сервера при idProduit = 12
[
{
"id_produit":"12",
"nom":"Switch Ethernet TP-Link TL-SG105",
"description":"10/100/1000 : 5 ports Gigabit Contrôle de flux 802.3x : 802.3x Gestion QoS (Quality of Service) 802.1P : 802.1p",
"prix":"3900",
"qte_stock":"5",
"img_avant":"http://moodyinformatics.000webhostapp.com/images/12.2.jpg",
"img_arriere":"http://moodyinformatics.000webhostapp.com/images/12.3.jpg",
"img_cote":"http://moodyinformatics.000webhostapp.com/images/12.4.jpg"}
]
AsyncTask работает в новом потоке для выполнения определенной задачи. Метод prepareFullInfo сразу возвращается, пока задача уже выполняется. Вы должны получить результаты в методе onPostExecute.
public class ConsultProductActivity extends AppCompatActivity {
String idProduit;
Product prod;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Bundle extra = intent.getExtras();
idProduit = extra.getString("idProduit");
Toast.makeText(ConsultProductActivity.this, idProduit, Toast.LENGTH_SHORT).show();
setContentView(R.layout.activity_consult_product);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_rest);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
prepareFullInfo();
}
public void prepareFullInfo() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
String productUrl = new String("http://moodyinformatics.000webhostapp.com/product_full_info.php?id=" + idProduit);@Override
protected Void doInBackground(Void... params) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(productUrl).build();try {
Response response = client.newCall(request).execute();
JSONArray array = new JSONArray(response.body().string());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
prod = new Product(object.getInt("id_produit"), object.getString("nom"), object.getString("description"), object.getInt("qte_stock"), object.getInt("prix"), object.getString("img_avant"), object.getString("img_arriere"), object.getString("img_cote"));
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
getSupportActionBar().setTitle(prod.getName());
ImageView imgAvant = (ImageView) findViewById(R.id.img_avant);
Glide.with(ConsultProductActivity.this).load(prod.getImg_avant()).into(imgAvant);
ImageView imgArriere = (ImageView) findViewById(R.id.img_arriere);
Glide.with(ConsultProductActivity.this).load(prod.getImg_arriere()).into(imgArriere);
ImageView imgCote = (ImageView) findViewById(R.id.img_cote);
Glide.with(ConsultProductActivity.this).load(prod.getImg_coté()).into(imgCote);
TextView prix = (TextView) findViewById(R.id.prix_consult_p);
prix.setText(prod.getPrice());
AppCompatTextView description = (AppCompatTextView) findViewById(R.id.description);
description.setText(prod.getDescription());
}
};
task.execute();
}
Других решений пока нет …