2016-08-03 2 views
0

J'essaie de connecter mon application Android au serveur, mais je reçois des erreurs et je ne sais pas ce qui ne va pas.connexion à la base de données du serveur dans Android

Voici ma classe MainActivity:

public class MainActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     try { 
      JsonReader jsonReader=new JsonReader(new JsonReader.AsyncResponse() { 
       @Override 
       public void processfinish(JSONObject output) { 
        Gson gson=new Gson(); 
        String message=gson.toJson(output); 
        Toast.makeText(getApplicationContext(),"this is "+message,Toast.LENGTH_LONG).show(); 
       } 
      }); 
      jsonReader.execute(); 


     } catch (IOException e) { 
      e.printStackTrace(); 
     }catch (Exception e){ 
      e.printStackTrace(); 

     } 
    } 
}  

et c'est ma classe JsonReader:

public class JsonReader extends AsyncTask<String,String,JSONObject>{ 
    final static String myurl="http://example.com"; 
    public interface AsyncResponse{ 
     void processfinish(JSONObject output); 
    } 
    public AsyncResponse delegate = null; 

    public JsonReader(AsyncResponse delegate){ 
     this.delegate = delegate; 
    } 
    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
     InputStream is = new URL(url).openStream(); 
     try { 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
      String jsonText = readAll(rd); 
      JSONObject json = new JSONObject(jsonText); 
      return json; 
     } 
     finally { 
      is.close(); 
     } 
    } 
    @Override 
    protected JSONObject doInBackground(String... strings) { 
     try { 
      JSONObject s = readJsonFromUrl(myurl); 
      return s; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonObject) { 
     super.onPostExecute(jsonObject); 
     delegate.processfinish(jsonObject); 
    } 
} 

J'ai créé AsyncResponse à l'aide de ce guide: How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

Et mon code serveur PHP:

<?php 
$dbhost = "myhost"; 
$dbuser = "myuser"; 
$dbname = "myname"; 
$dbpass = "mypassword"; 

$connect_db = mysql_connect ($dbhost, $dbuser, $dbpass); 
mysql_select_db($dbname,$connect_db); 
if ($connect_db){ 
    $result= mysql_query("SELECT * FROM `ask` ",$connect_db)or die(mysql_error()); 
    while($row = mysql_fetch_array($result)) 
    { 
     $qa=new StdClass(); 
     $qa->Question=$row['Question']; 
     $qa->Answer=$row['Answer']; 
     $qa->Answer2=$row['Answer2']; 
     $qa->Answer3=$row['Answer3']; 
     $qa->Answer4=$row['Answer4']; 
     echo "<br />"; 

     $rses=json_encode($qa); 
     echo $rses; 

    } 

}else{ 
    echo "error in connecting db"; 
} 
?> 

Lorsque je démarre mon application, il affiche "this is null", mais lorsque j'ouvre mon code PHP dans le navigateur, il affiche correctement les données. Quel est le problème?

MISE À JOUR:

i utilisé une autre URL et son travaillé. donc le problème est dans mes codes php.i retiré echo "<br />"; et l'a ouvert sur le navigateur.le résultat était {"Question":"question","Answer":"a","Answer2":"b","Answer3":"c","Answer4":"d"} je ne suis pas professionnel sur le format json mais je pense que son format n'est pas correct.Comment puis-je résoudre ce problème?

+0

Quelles erreurs avez-vous obtenir? –

+0

l'application compile sans crash et affiche un toast avec du texte "this is null" mais je m'attends à voir "this is" + json data du server.and dans logcat il montre "E/Surface: getSlotFromBufferLocked: tampon inconnu: 0xeb1cb8a0" j'ai cherché pour cela et il semble Android 6.0.0 bug mais j'ai testé sur Android 4.4.2 et le résultat était le même. –

+1

Je suppose que votre myurl n'est pas * littéralement * 'http: // example.com' mais est en fait une véritable URL résolvable et accessible depuis internet, ou au moins depuis le réseau sur lequel l'appareil est allumé? – alzee

Répondre

0

Votre navigateur affiche correctement le code HTML. Et ce sera caché à vos yeux

echo "<br />"; 

Android prend soin uniquement sur le contenu de la chaîne, il est donc impossible d'analyser cette balise de rupture.

Vous pouvez inspecter le logcat pour voir un JSONParseException se passe, si vous l'attraper et de retour nulle, de sorte que l'application ne tombe pas en panne

seul écho le JSON dans le PHP

Et puisque vous avoir une boucle while, vous voulez construire un JSONArray, et analyser cela au lieu d'essayer d'analyser une ligne JsonObject par ligne.

De plus, ce n'est pas nécessaire

String message=gson.toJson(output); 

Vous avez un JsonObject comme output, si juste toString que

+0

J'ai supprimé le code PHP et exécuter l'application, mais il montre toujours que c'est null et quand j'essaie l'application toString plantage parce que la sortie est nulle. –

+0

Je ne peux que deviner pourquoi l'application se bloque sans le ** full ** logcat. De plus, j'ai également dit, utilisez un tableau, ne supprime pas seulement cette ligne. Vous renvoyez null, cependant, lorsque le json ne peut pas être analysé, l'exception NullPointerException cache le problème réel, cela ressemble à –