3 Stimmen

Webview-Dateninkongruenz zwischen Android und HTML-Seite

Ich habe eine jQuery-Listenansicht in meinem Android-Webview, die Daten vom Server lädt. Ich verwende eine HTTP-GET-Antwort, um Daten aus der Server-Datenbank zu erhalten. Ich verwende dies in . Das ist meine Methode:

lastRecord=0;

    function loadRes(){
        $('#sample').html( 'hello' );
        $.get( 
        "queryRestaurantsList.php?lastRecord="+lastRecord,
        function( data ) {
            $('#rest_mesgs').append( data )
            .listview( 'refresh' );
        });
    }

Ich möchte jedoch diese Liste in einer bestimmten Reihenfolge sortieren. Dafür sende ich eine POST-Nachricht vom Android-Code an den Server, die einen String-Objekt wie dieses enthält:

String list_order ="0012,0002,0003,0001";

Dieses list_order String-Objekt stellt RestaurantID in der Datenbank dar, das auch der Primärschlüssel ist. Das Format dieses Primärschlüssels ist VARCHAR(4). Das ist meine php-Datei: Jedoch erhalte ich immer die Meldung "Still working" auf meiner Webansicht, obwohl ich den HTML der sortierten Liste in LogCat sehen kann durch HttpResponse

';   
        print '';
        print '';
        print ''.$row['Name'].'';
        print ''.$row['Type'].'';
        print ''.$row['Short_Loc'].'';
        print '';
        print '';
        }
}
else {
    echo "Still working";
    }

?>

HttpPostID.class - Klasse, die Daten an den Server POSTet

public class HttpPostID extends AsyncTask {

    static String result;

    private static final String webphp = "http://...../queryRestaurantsList.php";

    String IDs;

    HttpPostID(String ids){
        this.IDs =ids;
    }

    @Override
    protected Void doInBackground(Void... params){

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(webphp);

        try {

            String hello="111,222,333";

            List nameValuePairs = new ArrayList();
            nameValuePairs.add(new BasicNameValuePair("order",IDs));
            nameValuePairs.add(new BasicNameValuePair("hello",hello));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();

            result = EntityUtils.toString(resEntity);

            System.out.println(result);

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

        return null;
    }
}

Ich rufe dies in meiner Aktivität auf: new HttpPostID(tester).execute(); tester ist ein String-Objekt.

LogCat (nur ein paar Zeilen, da die Ausgabe groß ist)

07-12 02:25:14.850: I/System.out(10440): Pacific Coffee CompanySandwiches, Cut cakes, Pies, Pastries, Muffins, Premium Ground Coffee, Fruit JuicesMain Campus

5voto

Ratul Ghosh Punkte 1512

Zuerst schreiben Sie ein JavaScript im HTML wie folgt

 function reloadRes(var data){
    $('#sample').html( 'hello' );
    $('#rest_mesgs').append( data )
        .listview( 'refresh' );
}

dann schreiben Sie Http neu

public class HttpPostID extends AsyncTask {

static String result;

private static final String webphp = "http://...../queryRestaurantsList.php";

String IDs;

HttpPostID(String ids){
    this.IDs =ids;
}

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

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(webphp);

    try {

        String hello="111,222,333";

        List nameValuePairs = new ArrayList();
        nameValuePairs.add(new BasicNameValuePair("order",IDs));
        nameValuePairs.add(new BasicNameValuePair("hello",hello));

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();

        result = EntityUtils.toString(resEntity);

        System.out.println(result);
        return result;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

}
    @Override
    protected void onPostExecute(String data){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        webview.evaluateJavascript("javascript:reloadRes(data)",
                null);
    }
    else
    {
        webview.loadUrl("javascript:reloadRes(data)");
    }

    }

}

Ich bin ein Android-Entwickler, daher bin ich mir nicht sicher über die Funktion reloadRes(var data), bitte passen Sie sie nach Ihren Anforderungen an.

0voto

Canis Punkte 3895

Es ist schon eine Weile her, seit ich Android-Entwicklung betrieben habe, daher können sich die Dinge geändert haben, aber ich werde es versuchen.

Das Webview hat die Möglichkeit, Javascript-Funktionen in der geladenen HTML-Seite innerhalb desselben aufzurufen. Wenn Sie die Funktion so ändern (oder eine neue für diese spezielle Aufgabe erstellen), dass sie Parameter akzeptieren kann, können Sie diese Funktion vom Android-Code aus aufrufen, wenn Sie die Entfernungen berechnet haben.

lastRecord=0;

function loadRes(listOrder){
    $('#sample').html( 'hello' );
    $.get( 
    "queryRestaurantsList.php?lastRecord="+lastRecord+"&listOrder="+listOrder,
    function( data ) {
        $('#rest_mesgs').append( data )
        .listview( 'refresh' );
    });
}

Dann passen Sie einfach Ihr PHP an, um die Änderungen widerzuspiegeln:

echo $_GET['listOrder']; // Testen, ob der Parameter erfasst wird

if( isset($_GET['listOrder'],$_GET['lastRecord']) ){

$query = "SELECT RestaurantID,Name,Short_Loc,Image_Link,Full_Link,Type FROM Restaurant_Info
          ORDER BY FIND_IN_SET(RestaurantID,'".$ids."')";
...

Hoffentlich können Sie aus diesen Informationen das Notwendige herausfinden. Viel Glück!

PS! Ich wiederhole, ich bin wirklich aus der Übung, was die tatsächliche Android-Programmierung betrifft, aber ich sehe, dass ein Kommentator einen Link zu einer Frage mit Antworten hinterlassen hat, die im Grunde dieselbe Methode abdecken.

EDIT

Für mich hat Tibro die Android-Seite der Frage perfekt abgedeckt. Er sollte das Preisgeld erhalten, da ich nur in Javascript und PHP Code präsentieren konnte.

-1voto

itsben Punkte 1027

Ihre Klasse HttpPostID fehlt eine Methode. Die Methode doInBackground führt die Arbeit in einem Hintergrundthread durch. Die Ergebnisse werden jedoch in der onPostExecute-Methode gesammelt. Darüber hinaus sehe ich, dass Sie das Ergebnis (die Antwort des Http-Posts) einer statischen Variablen zuweisen. Dieser Wert sollte aus der doInBackground-Methode zurückgegeben werden. Er wird dann als Eingabeparameter an die onPostExecute-Methode übergeben. Dadurch benötigen Sie die statische Variable nicht mehr.

Schauen Sie sich den ersten Block des Beispielcodes hier an: http://developer.android.com/reference/android/os/AsyncTask.html. Ändern Sie Ihre HttpPostID-Klasse, um diesem Modell zu entsprechen, und Sie sollten bereit sein. Etwas.... der Beispielcode gibt ein long von doInBackground zurück. Dieser long ist in der Klassendeklaration enthalten und wird als Eingabeparameter für onPostExecute verwendet. Sie müssen zu einem String ändern, wie folgt:

private class DownloadFilesTask extends AsyncTask {

String IDs;

HttpPostID(String ids){
    this.IDs =ids;
}
protected String doInBackground(URL... urls) {
    String result = null;
    String webphp = "http://...../queryRestaurantsList.php";
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(webphp);

    try {

        String hello="111,222,333";

        List nameValuePairs = new ArrayList();
        nameValuePairs.add(new BasicNameValuePair("order",IDs));
        nameValuePairs.add(new BasicNameValuePair("hello",hello));

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();

        result = EntityUtils.toString(resEntity);

    } catch (Exception e) {
        e.printStackTrace();
    }
   return result;

 }

 protected void onPostExecute(String result) {
   // Diese Methode wird im Haupt-UI-Thread ausgeführt
   // Das Ergebnis ist das, was vom Http-Post zurückgegeben wird
   String html = result;
 }
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X