onPostExecute()无法启动

时间:2015-12-01 09:44:20

标签: java android json

我从DDBB下载的一些信息有问题。我收到所有信息,但我无法将其存储在我的数组上,因为onPostExecute()方法没有启动。我把我的代码:

RequestRocodromo.java,是用于发出请求并接收信息的类,关于“results”变量我有所有信息,但是我无法将它存储在onPostExecute()的数组中:

@Override
protected JSONObject doInBackground(String... params) 
{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(_url);

    String results = "NO OK";
    try 
    {       
        // Add your data
        /*List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("mac", _mac ));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));*/

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

        response.getAllHeaders();
        response.getEntity();

        if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
        {
            results = EntityUtils.toString(response.getEntity());
        }

        broadcastIntent = new Intent();
        broadcastIntent.putExtra("correcto", results);
        broadcastIntent.setAction(ACTION_REQUEST_ROCODROMO);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        _ctx.sendBroadcast(broadcastIntent);
    }       
    catch (Exception ex)
    {
        ex.printStackTrace();       
    }

    return null;
}

@Override
protected void onPostExecute(JSONObject jsonResponse) 
{
    super.onPostExecute(jsonResponse);

    List<String> values = new ArrayList<String>(); 
    ArrayList<String> rocodromoId = new ArrayList<String>();
    ArrayList<String> rocodromoArray = new ArrayList<String>();
    ArrayList<String> ciudadArray = new ArrayList<String>();
    ArrayList<String> comentarioArray = new ArrayList<String>();
    //Procesamos los resultados
    try
    {
        if(jsonResponse != null)
        {
            JSONArray jsonMainNode =jsonResponse.optJSONArray("edificios");

            int lengthJsonArr =jsonMainNode.length();
            for(int i=0; i<lengthJsonArr; i++)
            {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                rocodromoId.add(jsonChildNode.optString("id"));
                rocodromoArray.add(jsonChildNode.optString("nombre")); 
                ciudadArray.add(jsonChildNode.optString("ciudad")); 
                comentarioArray.add(jsonChildNode.optString("comentario")); 
                values.add(jsonChildNode.optString("nombre")); 
            }
        }

        String result[] = values.toArray(new String[values.size()]);

        broadcastIntent = new Intent();
        broadcastIntent.putExtra("edificios", result);
        broadcastIntent.putStringArrayListExtra("id_rocodromo", rocodromoId);
        broadcastIntent.putStringArrayListExtra("rocodromoArray", rocodromoArray);
        broadcastIntent.putStringArrayListExtra("ciudadArray", ciudadArray);
        broadcastIntent.putStringArrayListExtra("comentarioArray", comentarioArray);
        broadcastIntent.setAction(ACTION_REQUEST_ROCODROMO);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        _ctx.sendBroadcast(broadcastIntent);

    }
    catch (Exception e)
    {
        String result = "null";

        broadcastIntent = new Intent();
        broadcastIntent.putExtra("edificios", result);
        broadcastIntent.putStringArrayListExtra("id_rocodromo", rocodromoId);
        broadcastIntent.putStringArrayListExtra("rocodromoArray", rocodromoArray);
        broadcastIntent.putStringArrayListExtra("ciudadArray", ciudadArray);
        broadcastIntent.putStringArrayListExtra("comentarioArray", comentarioArray);
        broadcastIntent.setAction(ACTION_REQUEST_ROCODROMO);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        _ctx.sendBroadcast(broadcastIntent);
    }
}

Rocodromo.java,这是我启动execute方法的地方:

RequestRocodromo re = new RequestRocodromo(ctx, finalURL + "request=1");        

re.execute("");

Rocodromo.java,这是我的广播,当我尝试获取arraylist信息时,我收到了一个nullException,因为我的arraylist为null,因为它永远不会启动onPostExecute()方法。

public class ReceptorBroadcast extends BroadcastReceiver
{   
    @Override
    public void onReceive(Context arg0, Intent intent)
    {
        if(RequestRocodromo.ACTION_REQUEST_ROCODROMO.equals(intent.getAction()))
        {
            idRocodromo = intent.getStringArrayListExtra("id_rocodromo"); 
            Toast.makeText(getApplicationContext(), idRocodromo.get(0).toString(), Toast.LENGTH_LONG).show();
            rocodromo = intent.getStringArrayListExtra("rocodromoArray"); 
            Toast.makeText(getApplicationContext(), rocodromo.get(0).toString(), Toast.LENGTH_LONG).show();
            ciudad = intent.getStringArrayListExtra("ciudadArray"); 
            Toast.makeText(getApplicationContext(), ciudad.get(0).toString(), Toast.LENGTH_LONG).show();
            comentario = intent.getStringArrayListExtra("comentarioArray"); 
            Toast.makeText(getApplicationContext(), comentario.get(0).toString(), Toast.LENGTH_LONG).show();
        }
    }
}

有人可以帮助我吗?谢谢! :)

2 个答案:

答案 0 :(得分:0)

更改doInBackGround将null返回到:

try {
    return new JSONObject(reusults); 
} catch (Throwable t) {
    return null;
}

答案 1 :(得分:0)

将您的doInBackground()中的广播接收者呼叫更改为

runOnUiThread(new Runnable() {

          @Override
          public void run() {

          broadcastIntent = new Intent();
          broadcastIntent.putExtra("correcto", results);
          broadcastIntent.setAction(ACTION_REQUEST_ROCODROMO);
          broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
          _ctx.sendBroadcast(broadcastIntent);
        }
  });

并将onPostExecute中的null结果检查为..

if(null!=jsonResponse) // avoids null pointer;