2012-03-20 3 views
1

У меня возникла проблема с переносом некоторого исходного кода в Asynctask.Диалог о ходе работы Asynctask

Я читал несколько примеров Asynctask, а также статью разработчика Android о Asynctask, но мне трудно сопоставить ее с моим кодом вдали, который я могу понять.

ниже код дает мне ошибку и сила закрывается при выполнении doInBackground(), и Вызванный: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не называется Looper.prepare()

public class LoadingDialog extends AsyncTask<ArrayList<HashMap<String, String>>, Void, ArrayList<HashMap<String, String>>> 
{ 

    ProgressDialog pDialog = new ProgressDialog(Home.this); 


    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     pDialog = ProgressDialog.show(Home.this, "", "Loading..."); 

    } 

    protected ArrayList<HashMap<String, String>> doInBackground(ArrayList<HashMap<String, String>>... params) { 
     // TODO Auto-generated method stub 
     finalList.clear(); 
     eventList = database.getEvents(); 
     venueList = database.getVenues(); 
     finalList = createFinalList(eventList, venueList); 

     return finalList; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<HashMap<String, String>> result) { 
     // TODO Auto-generated method stub 
     pDialog.dismiss(); 

     ListAdapter adapter = new SimpleAdapter(Home.this, finalList , R.layout.home, 
        new String[] { "eventName", "venueName", "startTime"}, 
        new int[] { R.id.item_title, R.id.item_subtitle, R.id.item_datetime }); 
        setListAdapter(adapter); 

        lv = getListView(); 
        lv.setTextFilterEnabled(true); 

        lv.setOnItemClickListener(new OnItemClickListener() 
        { 
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
         { 
          Intent i = new Intent(Home.this, EventInfo.class); 

          HashMap<String, String> map = finalList.get(position); 
          String eID = map.get("eventId"); 
          String name = map.get("eventName"); 
          String venue = map.get("venueName"); 
          String lati = map.get("venueLatitude"); 
          String longi = map.get("venueLongitude"); 
          String opening = map.get("openingTimes"); 
          String descrip = map.get("venueDescription"); 
          String vID = map.get("venueId"); 
          String email = map.get("venueEmail"); 
          String phone = map.get("venuePhone"); 
          String facebook = map.get("venueFacebook"); 
          String twitter = map.get("venueTwitter"); 

          i.putExtra("itemId", eID); 
          i.putExtra("itemName", name); 
          i.putExtra("venueName", venue); 
          i.putExtra("venueLati", lati); 
          i.putExtra("venueLong", longi); 
          i.putExtra("opening", opening); 
          i.putExtra("venueDescription", descrip); 
          i.putExtra("venueID", vID); 
          i.putExtra("venueEmail", email); 
          i.putExtra("venuePhone", phone); 
          i.putExtra("venueFacebook", facebook); 
          i.putExtra("venueTwitter", twitter); 
          startActivityForResult(i, 0);    

         } 
        }); 

    } 


} 

Это часть дома класса:

public class Home extends ListActivity { 
int eventid; 
String[] venue = null; 
String[] name = null; 
private SqlParser database = new SqlParser(); 
private ArrayList<HashMap<String, String>> eventList = new ArrayList<HashMap<String, String>>(); 
private ArrayList<HashMap<String, String>> venueList = new ArrayList<HashMap<String, String>>(); 
private ArrayList<HashMap<String, String>> finalList = new ArrayList<HashMap<String, String>>(); 
ListView lv = null; 

Я был бы очень признателен за любую помощь.

+0

что делает 'createFinalList' делать? согласно вашему описанию, ошибки поступают оттуда или из вашей базы данных – njzk2

ответ

-1

создать эту строку ProgressDialog pDialog = новый ProgressDialog (Home.this); в стороне из AsynTask класса

+0

, создание ProgressDialog находится в onPreExecute, что является правильным способом его выполнения. – njzk2

+0

, тогда эта строка не задана. ProgressDialog pDialog = новый ProgressDialog (Home.this); –

+0

На самом деле это не – njzk2

-1

Просто проверьте код:

@Override 
    protected void onPostExecute(ArrayList<HashMap<String, String>> result) { 
     // TODO Auto-generated method stub 
     pDialog.dismiss(); 

     ListAdapter adapter = new SimpleAdapter(Home.this, finalList , R.layout.home, 
        new String[] { "eventName", "venueName", "startTime"}, 
        new int[] { R.id.item_title, R.id.item_subtitle, R.id.item_datetime }); 
        setListAdapter(adapter); 

        lv = getListView(); 

Здесь вы пытаетесь установить адаптер для ListView перед тем, как на самом деле ListView.

Это должно быть как:

lv = getListView(); 
setListAdapter(adapter); 
+0

нет никакой связи между этими двумя строками. – njzk2

+0

@ njzk2 Вы уверены? Позвольте мне, как вы можете установить адаптер, прежде чем вы получите ListView. –

+0

Я уверен, да. getListView возвращает ListView. setListAdapter - это метод класса ListActivity. Специфическая переменная lv не известна супер. – njzk2

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