2012-03-20 87 views
1

我有一个问题,我的一些初始代码移动到Asynctask中。Asynctask进度对话框

我一直在阅读几个Asynctask示例以及Asynctask上的Android开发人员文章,但是我发现很难将其与我能够理解的代码联系起来。

下面的代码给我一个错误和执行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 2012-03-20 12:48:41

回答

-1

创建此行ProgressDialog pDialog = new ProgressDialog(Home.this);在出侧AsynTask类

+0

ProgressDialog的创建是在onPreExecute,这是做它的正确方法。 – njzk2 2012-03-20 12:47:02

+0

然后这行是不重要ProgressDialog pDialog = new ProgressDialog(Home.this); – 2012-03-20 12:49:19

+0

事实上它不是 – njzk2 2012-03-20 12:49:48

-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 2012-03-20 12:48:11

+0

@ njzk2你确定吗?让我如何能够在获得ListView之前设置适配器。 – 2012-03-20 12:54:10

+0

我很确定,是的。 getListView返回一个ListView。 setListAdapter是ListActivity类的一个方法。超级不知道特定的lv变量。 – njzk2 2012-03-20 13:12:51