2017-04-05 1 views
0

json応答からjavaオブジェクト 'Product'を取得しようとしています.json応答はテーブルから1行しか返しません。とにかく私は両方を試してみましたが、動作しないので、私にNullPointerExceptionを与えています。私は、JSONObjectまたはJSONArrayを使用する必要があるかどうかを知りません。 Here'e私のコード:応答がテーブルから1行だけの場合にokhttpを使用してjson応答からJavaオブジェクトを取得する方法

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" 
    } 
] 
+0

あなたはidProduitを受け取っていますか?あなたはそれを持っていますか? – Joy

+0

私はすでにそのコードの部分をテストしていますが、正しいと思います。トーストでテストしました。問題は返された製品が常にnullです!!! –

答えて

1

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(); 
} 
+0

ありがとうございました!あなたは最高です:D –

関連する問題