使用AsyncTask从远程mySQL数据库中提取数据;仅显示最后一个表格行

时间:2012-09-05 20:45:10

标签: android database parsing android-asynctask

正如标题所说的那样。我有两列。我想把它们放到textview中,所以我做到了。但是只有底部的两个结果,每列显示一个。很奇怪。这是我的代码:http://pastebin.com/qNgfHfT3

解析/ onPostExecute位于问题所在的底部。

有一点需要注意:标记为“work”的日志& “dontwork”显示我的所有结果,但onPostExecute(Google& Google1)中的日志仅显示最后的结果,因此我假设错误在从解析到显示的转移中。

非常感谢这里的任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

如果您收到JSON响应,我建议您使用Gson解析它。只要你能用一对线解析整个东西,这是强烈推荐的。 请注意,创建正确的对象就像执行以下操作一样简单:

YourObject object = gson.fromJson(responseReader, YourObject.class);

或者即使您要检索项目列表:

Type listType = new TypeToken<List<YourObject>>() {}.getType();
List<YourObject> objects = gson.fromJson(responseReader, listType);

Here's一个完全符合您需求的示例

完成此过程后,您将在可访问变量中提供对象(或对象列表)。

修改 首先你的Asynctask应该有以下参数:

public class HttpTask extends AsyncTask<Void, Void, ArrayList<Driver>> {

并且你的doInBackground方法需要将该数组传递给你的onPostExecute:

@Override
protected ArrayList<Driver> doInBackground(Void... params) {

对于其余部分,我在JSon解析开始时接受它。

//PARSING JSON DATA
try {
    JSONObject json_data;
    Driver d;

    jArray = new JSONArray(result);
    int l = jArray.length();

    if(l>0){
        ArrayList<Driver> drivers = newArrayListList<Driver>();

        for (int i = 0; i < l; i++) {

            json_data = jArray.getJSONObject(i);

            d = new Driver(json_data.optString("Driver_full_name"), json_data.optString("Drives_for"));
            drivers.add(d);

            Log.i("work", returnString);
            Log.i("dontwork", somethingelse);

        }

   } catch (JSONException e1) {
       Log.d("DB", "Error somewhere");
       CurrentSeasonDrivers_DriverName.this.runOnUiThread(new Runnable() {
           public void run() {
               Toast.makeText(CurrentSeasonDrivers_DriversName, "Could not parse data so shut up", Toast.LENGTH_LONG).show();
           }
       });
   }
   return drivers;
}

protected void onPostExecute(ArrayList<Drivers>... drivers) {

   Log.i("Google", returnString);
   Log.i("Google1", somethingelse);

   String firstDriverName = drivers.get(0).name;
   String firstDriverDrivesFor = drivers.get(0).drivesfor;

   String secondDriverName = drivers.get(1).name;

   TextView drivername = (TextView) findViewById(R.id.DriverName);
   drivername.setText(firstDriverName);

   TextView drivesfor = (TextView) findViewById(R.id.DrivesFor);
   drivesfor.setText(firstDriverDrivesFor);

}

使用此功能,您的驱动程序的对象将完成圆圈。

public class Driver{

    public String name;
    public String drivesfor;

    public Driver(String _name, String _drivesfor){
        name = _name;
        drivesfor = _drivesfor;
    }

}

我想你可以从这里接管。 让我知道你的进展。