2012-03-04 162 views
1

我在android中完全是绿色的。我想创建从服务器获取数据并在应用程序中显示它的应用程序。任何人都可以告诉我如何启动它?我在下面试过这段代码。但唯一的例外是显示没有找到食物。Android,从服务器获取数据

private EditText outputStream; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    String result = null; 
    InputStream input = null; 
    StringBuilder sbuilder = null; 
    outputStream = (EditText)findViewById(R.id.output); 
    ArrayList <NameValuePair> nameValuePairs = new ArrayList <NameValuePair>(); 

    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("ik.su.lt/~jbarzelis/index.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     if (response.getStatusLine().getStatusCode() != 200) { 
      Log.d("MyApp", "Server encountered an error"); 
     } 
     HttpEntity entity = response.getEntity(); 
     input = entity.getContent(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input,"iso-8859-1"),8); 
     sbuilder = new StringBuilder(); 

     String line = null; 

     while((line = reader.readLine()) != null){ 
      sbuilder.append(line + "\n"); 
     } 
     input.close(); 
     result = sbuilder.toString(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    int fd_id; 
    String fd_name; 
    try{ 
     JSONArray jArray = new JSONArray(result); 
     JSONObject json_data = null; 
     for(int i=0;i<jArray.length();i++){ 
      json_data = jArray.getJSONObject(i); 
      fd_id = json_data.getInt("FOOD_ID"); 
      fd_name = json_data.getString("FOOD_NAME"); 
      outputStream.append(fd_id +" " + fd_name + "\n"); 
     } 


     } 
    catch(JSONException e1){ 
     Toast.makeText(getBaseContext(), "No food found", Toast.LENGTH_LONG).show(); 
    } 
    catch(ParseException e1){ 
     e1.printStackTrace(); 
    } 
} 

PHP代码是正确的,它显示的数据。我认为somethig与上面的代码是错误的。

<?php 
    mysql_connect("localhost","********","**********"); 
    mysql_select_db("test"); 
    $sql = mysql_query("select FOOD_NAME as 'Maistas' from FOOD where FOOD_NAME like 'A%'"); 
    while($row = mysql_fetch_assoc($sql)) $output[]=$row; 
    print(json_encode($output)); 
    mysql_close; 
?> 

回答

3
package com.Valluru; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.net.ParseException; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Food extends ListActivity { 
String result = null; 
InputStream is = null; 
StringBuilder sb=null; 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
ListView list1; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    list1 = (ListView) findViewById(android.R.id.list); 

    //http post 
    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://10.0.2.2/food.php"); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
    }catch(Exception e){ 
     Log.e("log_tag", "Error in http connection"+e.toString()); 
    } 

    //convert response to string 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     sb = new StringBuilder(); 
     sb.append(reader.readLine() + "\n"); 
     String line="0"; 

     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 

     is.close(); 
     result=sb.toString(); 

    }catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    //paring data 
    String fd_id; 
    String fd_name; 
    try{ 
    JSONArray jArray = new JSONArray(result); 
    JSONObject json_data=null; 

    for(int i=0;i<jArray.length();i++){ 
      json_data = jArray.getJSONObject(i); 
      fd_id =json_data.getString("FOOD_ID"); 

      fd_name = json_data.getString("FOOD_NAME"); 
      nameValuePairs.add(new list<String, String>(fd_id, fd_name)); 
    } 

    list1.setAdapter(new ArrayAdapter<NameValuePair>(getApplicationContext(),android.R.layout.simple_expandable_list_item_1,nameValuePairs)); 

    }catch(JSONException e1){ 
     Toast.makeText(getBaseContext(), "No FOOD Found", Toast.LENGTH_LONG).show(); 
    }catch (ParseException e1){ 
     e1.printStackTrace(); 
    } 

} 
} 

list.java 包com.Valluru;

import org.apache.http.NameValuePair; 

import android.R.integer; 

public class list<T,V> implements NameValuePair { 
T data; 
V text; 

public list(T data, V text) 
{ 
    this.data = data; 
    this.text = text; 
} 

@Override 
public String toString(){ 
    return text.toString(); 
} 

@Override 
public String getName() { 
    return (String) data; 
} 

@Override 
public String getValue() { 
    return (String) text; 
} 
} 

food.php

<?php 
    mysql_connect("localhost","root"); 
    mysql_select_db("FOOD"); 
    $sql=mysql_query("select * from FOOD where FOOD_NAME like '%'"); 
    while($row=mysql_fetch_assoc($sql)) $output[]=$row; 
    print(json_encode($output)); 
    mysql_close(); 
?> 
+0

food.java文件将请求本地主机和服务器(本地主机)将回复..........在这里我使用服务器作为本地主机的IP地址是http://10.0.2.2 – 2012-04-26 16:54:43

1

事情尝试:

  1. 在服务器上,有任何食物以A开头的?
  2. 您是否尝试过从脚本中返回一个简单的字符串,而不是运行查询?
  3. 是否有任何Log调用写入LogCat?如果是这样,它说什么?
  4. 最初的httpclient.execute是否起作用或者是触发的异常?
  5. 在result = sbuilder.toString()上设置一个断点,并调试该值。那里有没有有效的JSON字典,还是其他的?
  6. 如果第4步和/或第5步失败,并且您不确定原因,请尝试使用Fiddler分析您的http流量。

如果上述任何一个步骤都没有解决,那么您必须退出您的项目并首先将这些事情弄清楚。在需要的地方实验,学习并提出具体问题。

+0

我检查。问题是它会返回不是JSON的HTML代码。这是问题所在。 – Shien 2012-03-21 19:37:08

1

您解析失败thoes领域:

fd_id = json_data.getInt("FOOD_ID"); 
fd_name = json_data.getString("FOOD_NAME") 

;

这是一个服务器错误