2013-12-17 5 views
0

Когда я запускаю свое приложение, onPostExecute, похоже, не называется. Он не заполняет пользовательский интерфейс, как должен. Кроме того, на DoInBackground, любые сообщения журнала мимо цикл:onPostExecute, похоже, не вызван

for (int i = 0; i < businesses.length(); i++) { }

исключая сообщения журнала в том, что конкретный цикл не показаны. Так, например, сообщение журнала во втором цикле for(int j = 0; j < businessNames.size(); j++) { } по какой-либо причине не показано. Является ли это вопросом времени или я что-то упускаю?

Но как раз подытожить, пользовательский интерфейс в моем onPostExecute не попадает (как я знаю).

Вот мой код

public class CoffeeResultActivity extends Activity{ 

ExpandableListAdapter listAdapter; 
ExpandableListView expListView; 
List<String> businessNames = new ArrayList<String>(); 
List<String> businessInfo = new ArrayList<String>(); 
HashMap<String, List<String>> listDataChild = new HashMap<String, List<String>>(); 

private int lastExpandedPosition = -1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    expListView = (ExpandableListView) findViewById(R.id.lvExp); 

    //Calling AsyncTask 
    new RetreiveSearchResults().execute("coffee"); 

    // Listview Group click listener 
    expListView.setOnGroupClickListener(new OnGroupClickListener() { 

     @Override 
     public boolean onGroupClick(ExpandableListView parent, View v, 
       int groupPosition, long id) { 
      return false; 
     } 
    }); 

    expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 
     @Override 
     public void onGroupExpand(int groupPosition) { 
      if (lastExpandedPosition != -1 && groupPosition != lastExpandedPosition) { 
       expListView.collapseGroup(lastExpandedPosition); 
      } 

      lastExpandedPosition = groupPosition; 

     } 
    }); 

    // Listview Group collasped listener 
    expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 

     @Override 
     public void onGroupCollapse(int groupPosition) { 
      Toast.makeText(getApplicationContext(), 
        businessNames.get(groupPosition) + " Collapsed", 
        Toast.LENGTH_SHORT).show(); 

     } 
    }); 

    // Listview on child click listener 
    expListView.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
       int groupPosition, int childPosition, long id) { 
      // TODO Auto-generated method stub 
      Toast.makeText(
        getApplicationContext(), 
        businessNames.get(groupPosition) 
          + " : " 
          + listDataChild.get(
            businessNames.get(groupPosition)).get(
            childPosition), Toast.LENGTH_SHORT) 
        .show(); 
      return false; 
     } 
    }); 

} 

class RetreiveSearchResults extends AsyncTask<String, Void, Void> { 


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

     // Some example values to pass into the Yelp search service. 
     String category = "coffee"; 

     // Execute a signed call to the Yelp service. 
     OAuthService service = new ServiceBuilder().provider(YelpApi2.class).apiKey("key").apiSecret("key").build(); 
     Token accessToken = new Token("key", "key"); 
     OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.yelp.com/v2/search"); 
     request.addQuerystringParameter("location", "Waterfront, Boston, MA"); 
     request.addQuerystringParameter("category", category); 
     service.signRequest(accessToken, request); 
     Response response = request.send(); 
     String rawData = response.getBody(); 



      try { 
       JSONObject json = new JSONObject(rawData); 
       JSONArray businesses; 
       businesses = json.getJSONArray("businesses"); 

       for (int i = 0; i < businesses.length(); i++) { 
         JSONObject business = businesses.getJSONObject(i); 
         //Log.d("FOO FOO", "FOO FOO FOO" + business.toString()); 
         businessNames.add(business.get("name").toString()); 

         //The following log message gets displayed 
         Log.d("FOO FOO", "FOO FOO " + businessNames.get(i)); 

         businessInfo.add(business.get("rating").toString()); 

         //The following log message gets displayed 
         Log.d("FOO FOO", "FOO FOO " + businessInfo.get(i)); 
       } 
       //The following log message gets displayed 
       Log.d("FOO FOO", "SIZE" + businessNames.size()); 
       for(int j = 0; j < businessNames.size(); j++) { 

        //The following log message DOES NOT GET DISPLAYED. But it does run through this for loop in debugger. 
        Log.d("FOO FOO", "FOO FOO ##### Get Here?); 

        //In Debugger, listDataChild does get populated. 
        listDataChild.put(businessNames.get(j), businessInfo); 
       } 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     return null; 
    } 

    protected void onPostExecute() { 

     //Does not enter onPostExecute in Debugger nor on a Regular run. 

     //Log message does NOT get printed 
     Log.d("FOO FOO", "FOO FOO Get in POST?"); 

     listAdapter = new ExpandableListAdapter(CoffeeResultActivity.this, businessNames, listDataChild); 
     listAdapter.notifyDataSetChanged(); 

     // setting list adapter 
     expListView.setAdapter(listAdapter); 


    } 
} 

}  

ответ

2

Ваш onPostExecute не соответствует сигнатуре AsyncTasks.

Попробуйте добавить Пустоты параметр для метода следующим образом:

protected void onPostExecute(Void result){} 
+0

СПАСИБО! Вот так! – Zack

0

Вы, кажется, забыли добавить свой @Override тег в onPostExecute

+0

Это указывает на проблему, но добавив эту аннотацию не решить - метод ничего не отменяет, так как он имеет неправильную подпись. В Java6 и более поздних версиях была бы ошибка времени компиляции, если метод переопределяет другую без аннотации. – laalto

+0

О, хорошо ... чем больше вы знаете! : p –

5

Сигнатура onPostExecute неправильно. Это должно быть как

protected void onPostExecute(Void result) { 
} 
+1

СПАСИБО! Вот так! – Zack

+1

@ Zack вы можете добавить аннотацию '@ Override' к методам, которые унаследованы от родительского класса *, а если вы используете * Eclipse *, он предупредит вас, что метод неверен (в этом случае, поскольку подпись был неправ). – Phil

Смежные вопросы