2017-05-12 1 views
0

Hey Im assez nouveau pour android développement et Im actuellement en train d'essayer d'établir une connexion à ma base de données afin que je puisse travailler avec les données sur mon téléphone. Im utilisant OkHttp et mysqli avec php.OkHttp - Android obtenir des données à partir de la base de données MySQL

J'ai écrit un gestionnaire qui accède aux pages .php et effectue les appels de base de données.

public class OkHttpHandler extends AsyncTask<String, Void, String> { 

private OkHttpClient client = null; 

public String latestMessage = ""; 

public OkHttpHandler(){ 

    client = new OkHttpClient(); 
} 

@Override 
protected String doInBackground(String... params) { 
    Request.Builder builder = new Request.Builder(); 
    builder.url(params[0].toString()); 
    Request request = builder.build(); 

    try{ 
     Response response = client.newCall(request).execute(); 
     latestMessage = response.body().string(); 
     return response.body().string(); 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    //latestMessage = "failed"; 
    return null; 
} 

Et je veux faire quelque chose comme ceci:

public int getSongwriterId(String songwriter) { 
    OkHttpHandler okHttpHandler = new OkHttpHandler(); 
    okHttpHandler.execute(url_get_songwriter_id + "?songwriter=" + songwriter); 
    String responseString = ""; 
    while(responseString == "") { 
     responseString = okHttpHandler.latestMessage; 
    } 
    okHttpHandler.cancel(true); 
    Songwriter s = getSongwriterFromJSON(responseString); 

    return s.getId(); 
    } 

Maintenant, je sais que ce laid while (true) est une solution merdique. Mais comment dois-je le faire si Im 100% certain que j'ai eu ma responseString avant de le passer dans "getSongwriterFromJSON"? Je ne comprends vraiment pas comment cela est censé fonctionner.

Le code fonctionne très bien lorsque je le débogue pas à pas, mais l'application ne fait que noircir de temps en temps sans débogage. Je suppose que cela est dû à la boucle while (true) et que ça fonctionne et court et clique sur le thread de sorte que mon thread de fond meurt juste - je ne sais vraiment plus. S'il vous plaît, si vous fournissez de l'aide, expliquez ce que je fais de mal et comment je devrais le faire correctement. Merci.

Modifier fichier php utilisé:

<?php 
$response = array(); 

$con = @mysqli_connect("XXX", "XXX", "XXX", "XXX"); 

if (mysqli_connect_errno()) 
{ 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$sql = "Select * FROM songwriter "; 
$sql .= "where composerName = '"; 
$sql .= $_GET["songwriter"]; 
$sql .= "'"; 

$query = mysqli_query($con,$sql); 

// looping through all results 
$response["songwriter"] = array(); 

while ($row = mysqli_fetch_array($query)) { 
    $songwriter = array(); 
    $songwriter["id"] = $row["id"]; 
    $songwriter["composerName"] = $row["composerName"]; 
    $songwriter["arrangerName"] = $row["arrangerName"]; 

    // push single product into final response array 
    array_push($response["songwriter"], $songwriter); 
} 

// echoing JSON response 
echo json_encode($response); 
?> 
+1

Est-ce que votre script PHP donner une réponse? Ajoutez votre script PHP ainsi – Zoe

+0

J'ai juste ajouté mon fichier php - oui, il donne une réponse.Cela fonctionne bien en mode débogage. Mais ne fera pas son travail si je le laisse fonctionner normalement. – Vulkanos

Répondre

0

Vous utilisez l'API de synchronisation de OkHttp alors qu'il ya un async un, que vous devez utiliser:

Ce while est un goulot d'étranglement grave, il faut l'enlever dès que possible. Essayez quelque chose comme ceci:

Request.java

import okhttp3.Call; 
import okhttp3.Callback; 
import okhttp3.OkHttpClient; 
import okhttp3.RequestBody; 
import okhttp3.Response; 

/** Very basic Request helper **/ 
public class Request { 

    public static OkHttpClient client = null; 

    /** 
     * Get the current OkHttpClient or creates a new one if it doesn't exists 
     * @return OkHttpClient 
     */ 

    public static OkHttpClient getClient(){ 

     if(client == null) 
      client = new OkHttpClient(); 

     return client; 
    } 

    public Call get(String url, Callback callback) { 

     okhttp3.Request request = new okhttp3.Request.Builder() 
      .url(url) 
      .get() 
      .build(); 

     Call call = getClient().newCall(request); 
     call.enqueue(callback); 

     return call; 

    } 
} 

Activité

//... 
public interface MyCallback { 
    void run(Object data); //Generic callback 
} 


public void getSongwriterId(String songwriter, MyCallback myCallback) { 


    Request.get(url_get_songwriter_id + "?songwriter=" + songwriter, new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
     //Handle error 
     } 

     @Override 
     public void onResponse(Call call, final Response response) throws IOException { 

     final String body = response.body().string(); //Get API response 

     final Songwriter s = getSongwriterFromJSON(body); 

     //Remove it if you just need to show the ID in the UI 
     myCallback.run(s.getId()) 

     //OKHttp callback isn't in the main thread, 
     //UI operations need to be run in the main thread 
     //That's why you should use runOnUiThread 
     MyActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //Handle UI here if needed   
       ((TextView) findViewById(R.id.myTextView)).setText(s.getId()); 

      } 
     }); 
     } 
    }); 
} 
//... 
0

Je peux me tromper, mais vous n'êtes pas censé écrire un @ devant mysqli_connect:

$con = @mysqli_connect("XXX", "XXX", "XXX", "XXX"); 

Essayez de le remplacer par:

$con = mysqli_connect("XXX", "XXX", "XXX", "XXX"); 

Et évidemment remplacer les X'es avec vos informations d'identification.

Si cela ne fonctionne pas (ou si un @ en face de mysqli_connect est autorisé en php, et que vous avez essayé de le tester après l'avoir supprimé), exécutez le script PHP depuis votre ordinateur, le présentant comme un site web. Assurez-vous d'avoir des erreurs visibles.

S'il n'y a aucun problème avec le script PHP, ajoutez des balises Log.e avec une balise fixe dans votre code Java. Essayez de voir s'il y a quelque chose qui ne va pas. Assurez-vous que la connexion réussit également.

+0

Vous le faites, sinon vous obtenez une exception networkonmainthread ... C'est la raison principale dont j'ai besoin pour faire tout ce truc asynchrone. – Vulkanos

+0

Ignorer cette partie (juste enlevé aussi): faire les autres choses – Zoe

+0

Je l'ai fait - ne fonctionnera toujours pas. Comme je l'ai dit - tout fonctionne bien quand je débogue et je le lance lentement. J'ai regardé toutes les méthodes dans mon code et tous les appels. Tant que je débogue, cela fonctionnera étape par étape. Mais quand je laisse mon App s'exécuter sans débogage, il se bloque juste et ne fonctionne pas. Imo. le problème est le "while (responseString ==" ")". – Vulkanos