2012-11-18 277 views
0

我有一个ProgressDialog,通过执行php脚本从数据库中获取后台数据。 我正在使用gson Google库。未执行FOR循环中的代码

{"surveys":[{"id_survey":"1","question_survey":"Are you happy with the actual government?","answer_yes":"50","answer_no":"20"}],"success":1} 

然而,ProgressDialog背景治疗都不尽如人意:从浏览器中执行时,PHP脚本运行良好

@Override 
     protected Void doInBackground(Void... params) { 
      String url = "http://192.168.1.4/tn_surveys/get_all_surveys.php"; 

      HttpGet getRequest = new HttpGet(url); 
      Log.d("GETREQUEST",getRequest.toString()); 

      try { 

       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       Log.d("URL1",url); 

       HttpResponse getResponse = httpClient.execute(getRequest); 
       Log.d("GETRESPONSE",getResponse.toString()); 
       final int statusCode = getResponse.getStatusLine().getStatusCode(); 
       Log.d("STATUSCODE",Integer.toString(statusCode)); 
       Log.d("HTTPSTATUSOK",Integer.toString(HttpStatus.SC_OK)); 
       if (statusCode != HttpStatus.SC_OK) { 
        Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url); 
        return null; 
       } 

       HttpEntity getResponseEntity = getResponse.getEntity(); 
       Log.d("RESPONSEENTITY",getResponseEntity.toString()); 
       InputStream httpResponseStream = getResponseEntity.getContent(); 
       Log.d("HTTPRESPONSESTREAM",httpResponseStream.toString()); 
       Reader inputStreamReader = new InputStreamReader(httpResponseStream); 

       Gson gson = new Gson(); 
       this.response = gson.fromJson(inputStreamReader, Response.class); 

      } 
      catch (IOException e) { 
       getRequest.abort(); 
       Log.w(getClass().getSimpleName(), "Error for URL " + url, e); 
      } 

      return null; 
     } 
    @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       Log.d("HELLO","HELLO"); 
       StringBuilder builder = new StringBuilder(); 
       Log.d("STRINGBUILDER","STRINGBUILDER"); 
       for (Survey survey : this.response.data) { 
        String x= survey.getQuestion_survey(); 
        Log.d("QUESTION",x); 
        builder.append(String.format("<br>ID Survey: <b>%s</b><br> <br>Question: <b>%s</b><br> <br>Answer YES: <b>%s</b><br> <br>Answer NO: <b>%s</b><br><br><br>", survey.getId_survey(), survey.getQuestion_survey(),survey.getAnswer_yes(),survey.getAnswer_no())); 

       } 

       Log.d("OUT FOR","OUT"); 
       capitalTextView.setText(Html.fromHtml(builder.toString())); 
       progressDialog.cancel(); 
      } 

HELLO登录时显示。 显示STRINGBUILDER日志。 问题日志不显示。 显示OUT FOR Log。

调查类:

public class Survey { 

    int id_survey; 
    String question_survey; 
    int answer_yes; 
    int answer_no; 

    public Survey() { 

     this.id_survey = 0; 
     this.question_survey = ""; 
     this.answer_yes=0; 
     this.answer_no=0; 
    } 

    public int getId_survey() { 
     return id_survey; 
    } 

    public String getQuestion_survey() { 
     return question_survey; 
    } 

    public int getAnswer_yes() { 
     return answer_yes; 
    } 

    public int getAnswer_no() { 
     return answer_no; 
    } 


} 

响应等级:

public class Response { 

    ArrayList<Survey> data; 

    public Response() { 
     data = new ArrayList<Survey>(); 
    } 
} 

请有关为什么FOR循环不执行任何帮助。 谢谢你的帮助。

回答

2

任何帮助请关于为什么FOR循环未执行。

简单地说:data是空的。 (所以没有什么的循环遍历...)

尝试这样的事情,从GSON's documentation

Type listType = new TypeToken<List<String>>() {}.getType(); 
List<String> target = new LinkedList<String>(); 
target.add("blah"); 

Gson gson = new Gson(); 
String json = gson.toJson(target, listType); 
List<String> target2 = gson.fromJson(json, listType); 

我没有用自己GSON,但也有如何的其他例子阅读列表:

+0

但数据在该行中不为空:'this.response = gson.fromJson(inputStreamReader,Response.class);'否?所以那里有“调查”对象。 – androniennn

+0

这肯定是一个盲猜:D,因为我不能从响应转换为ArrayList。但请查看Response构造函数,当有响应实例时,数据列表列表不为空,它将存储调查数据。 – androniennn

+1

在Response的构造函数中,你用'new ArrayList ();'创建一个空列表,但是你永远不会传递任何数据... – Sam

0

您的onPostExecute接受一个名为result的参数。您的for循环遍历名为response的实例变量中的元素。他们应该是一样的吗?

+0

不,他们不一样。 – androniennn

+1

引用由执行阶段更新的实例变量即将起作用并不明确。它不是AsyncTask类的特别允许的操作之一。您可以将执行阶段的结果定义为Survey,并且该参数将显示为onPostExecute的参数。 – emrys57

+0

请提供任何代码建议?因为由于某种原因,数据变量似乎是空的。 – androniennn