我在android中编写了一个长代码,当餐馆列表加载到listview时会显示一个进度对话框。现在的问题是,当餐馆列表再次加载到用户过滤器更改时,它的工作正常,但仅在第一次。即使列表视图已填充,它也会继续显示,用户必须按下deivce的后退按钮手动关闭它。在这种情况下,我不知道在哪里写pg.dismiss()。在这里发布我的代码。请告诉我..
package com.Refinedymapps;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.location.Geocoder;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
public class Restaurantlist extends Activity implements OnClickListener, OnItemSelectedListener {
ProgressDialog pg;
private ImageButton imgbtn;
private ListView restaurant;
private TextView city;
String sendid,flagdopost="",linkurl;
LocationManager locationManger;
Geocoder gc;
Bundle bundle;
private int j=0;
private Spinner cuisine,area;
static ArrayList<HashMap<String,String>> customlist= new ArrayList<HashMap<String,String>>();
private String asynctaskflag="",cuisineval,areaval;
List<String> tempareanamelist,tempcuisinenamelist,areanamelist,cuisinelist,cuisineidlist,restaurantnames,areanames,restaurantidlist,originalcuisinelist,originalarealist;
String str,coun,stat,cid,sid,cityid,cityname;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.restaurantlisting);
linkurl=getResources().getString(R.string.linkurl);
city=(TextView)findViewById(R.id.textviewcity);
cuisine=(Spinner)findViewById(R.id.spncuisine);
area=(Spinner)findViewById(R.id.spnarea);
restaurant=(ListView)findViewById(R.id.lstrestaurant);
imgbtn=(ImageButton)findViewById(R.id.imageButton1);
bundle = this.getIntent().getExtras();
imgbtn.setImageResource(R.drawable.searchloc);
asynctaskflag="init";
new Thetask().execute(asynctaskflag,null,null);
imgbtn.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Intent newlocintent=new Intent(Restaurantlist.this,Restaurantlistdisplay.class);
startActivity(newlocintent);
}
});
restaurant.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(getBaseContext(), "resname"+restaurantnames.get(arg2)+"areaname"+areanames.get(arg2), 10).show();
String[] getid={"itemclick",restaurantnames.get(arg2),areanames.get(arg2)};
new Thetask().execute(getid);
}
});
}
public void populateReslist()
{
Log.i("inside populatereslist","value of j is:"+j);
for(int i=0;i<restaurantnames.size();i++)
{
HashMap<String,String> temp = new HashMap<String,String>();
temp.put("Restaurant Name",restaurantnames.get(i).toString());
temp.put("Area Name", areanames.get(i).toString());
customlist.add(temp);
}
}
public List<String> getAreanames(String cityid)
{
String list = null;
areanamelist=new ArrayList<String>();
final HttpClient client=new DefaultHttpClient();
final HttpGet req=new HttpGet(linkurl+"/ymaws/resources/restaurant/"+cityid+"/areas/");
HttpResponse httpResponse;
try {
httpResponse=client.execute(req);
HttpEntity entity = httpResponse.getEntity();
Log.i("entity", entity.toString());
if (entity != null)
{
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
StringBuilder sb = new StringBuilder();
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
instream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
// Closing the input stream will trigger connection release
list= sb.toString();
Log.i("areaname xml is", list.toString());
}
}
catch(Exception e)
{
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try
{
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(new InputSource(new StringReader(list)));
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("Area");
for (int i=0;i<items.getLength();i++)
{
Node item = items.item(i);
NodeList properties = item.getChildNodes();
for (int j=0;j<properties.getLength();j++)
{
Node property = properties.item(j);
String name = property.getNodeName();
if (name.equalsIgnoreCase("areaName"))
{
areanamelist.add(property.getFirstChild().getNodeValue());
}
else
{
}
}
}
//Log.i("areaname list in getAreas method", areanamelist.toString());
return areanamelist;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public List<String> getCuisines(String cityid)
{
String list = null;
cuisinelist=new ArrayList<String>();
cuisineidlist=new ArrayList<String>();
final HttpClient client=new DefaultHttpClient();
final HttpGet req=new HttpGet(linkurl+"/ymaws/resources/restaurant/"+cityid+"/cuisines/");
HttpResponse httpResponse;
try {
httpResponse=client.execute(req);
HttpEntity entity = httpResponse.getEntity();
Log.i("entity", entity.toString());
if (entity != null)
{
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
StringBuilder sb = new StringBuilder();
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
instream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
// Closing the input stream will trigger connection release
list= sb.toString();
Log.i("cuisinename xml is", list.toString());
}
}
catch(Exception e)
{
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try
{
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(new InputSource(new StringReader(list)));
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("Cuisine");
for (int i=0;i<items.getLength();i++)
{
Node item = items.item(i);
NodeList properties = item.getChildNodes();
for (int j=0;j<properties.getLength();j++)
{
Node property = properties.item(j);
String name = property.getNodeName();
if (name.equalsIgnoreCase("cuisineName"))
{
cuisinelist.add(property.getFirstChild().getNodeValue());
}
else if(name.equalsIgnoreCase("cuisineId"))
{
cuisineidlist.add(property.getFirstChild().getNodeValue());
}
}
}
Log.i("getcuisine cuisinelist",cuisinelist.toString());
return cuisinelist;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void firequery()
{
String url = null;
if(cuisineval=="*" && areaval=="*")
{
url=linkurl+"/ymaws/resources/restaurant/"+cityid+"/restaurants";
}
else if(cuisineval!="*" && areaval=="*")
{
for(int i=0;i<originalcuisinelist.size();i++)
{
Log.i("cuisinelist original item is",""+originalcuisinelist.get(i));
Log.i("cuisineidlist is",cuisineidlist.toString());
if((cuisine.getSelectedItem().toString()).equalsIgnoreCase(originalcuisinelist.get(i).toString()))
{
Log.i("cuisineid selected is",""+cuisineidlist.get(i));
url=linkurl+"/ymaws/resources/restaurant?cityid="+cityid+"&cuisineid="+cuisineidlist.get(i);
}
}
}
else if(cuisineval=="*" && areaval!="*")
{
url = linkurl+"/ymaws/resources/restaurant?cityid="+cityid+"&areanm="+area.getSelectedItem().toString();
}
else
{
for(int i=0;i<originalcuisinelist.size();i++)
{
if((cuisine.getSelectedItem().toString()).equalsIgnoreCase(originalcuisinelist.get(i).toString()))
{
url=linkurl+"/ymaws/resources/restaurant?cityid="+cityid+"&cuisineid="+cuisineidlist.get(i)+"&areanm="+area.getSelectedItem().toString();
}
}
}
getResult(url);
}
public void getResult(String url)
{
String list = null;
restaurantnames=new ArrayList<String> ();
areanames=new ArrayList<String>();
restaurantidlist=new ArrayList<String>();
final HttpClient client=new DefaultHttpClient();
Log.i("url is","url:"+url.toString());
final HttpGet req=new HttpGet(url.replaceAll(" ", "%20"));
HttpResponse httpResponse;
try {
httpResponse=client.execute(req);
HttpEntity entity = httpResponse.getEntity();
Log.i("entity", entity.toString());
if (entity != null)
{
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
StringBuilder sb = new StringBuilder();
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
instream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
list= sb.toString();
Log.i("list xml is", list.toString());
}
}
catch(Exception e)
{
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try
{
if(list!=null)
{
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(new InputSource(new StringReader(list)));
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("resLovData");
for (int i=0;i<items.getLength();i++)
{
Node item = items.item(i);
NodeList properties = item.getChildNodes();
for (int j=0;j<properties.getLength();j++)
{
Node property = properties.item(j);
String name = property.getNodeName();
if (name.equalsIgnoreCase("locName"))
{
restaurantnames.add(property.getFirstChild().getNodeValue());
}
else if(name.equalsIgnoreCase("areaName"))
{
areanames.add(property.getFirstChild().getNodeValue());
}
else if(name.equalsIgnoreCase("locId"))
{
restaurantidlist.add(property.getFirstChild().getNodeValue());
}
}
}
}
else
{
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
public class Thetask extends AsyncTask<String, Void, Void>
{
String x,y;
@Override
public void onPreExecute()
{
pg =new ProgressDialog(Restaurantlist.this);
pg.setMessage("fetching info....");
pg.setIndeterminate(true);
pg.setCancelable(true);
Log.i("inside preexecute","in pre execute");
pg.show();
}
public Void doInBackground(String... params)
{
if(params[0].equalsIgnoreCase("init"))
{
Log.i("inside doinbackground 1st",flagdopost);
cid=bundle.getString("cid");
sid=bundle.getString("sid");
cityid=bundle.getString("cityid");
cityname=bundle.getString("cityname");
originalcuisinelist=new ArrayList<String>();
originalcuisinelist=getCuisines(cityid);
tempcuisinenamelist = getCuisines(cityid);
tempcuisinenamelist.add(0,"All");
originalarealist=new ArrayList<String>();
originalarealist=getAreanames(cityid);
tempareanamelist=getAreanames(cityid);
tempareanamelist.add(0,"All");
Log.i("area are",tempareanamelist.toString());
flagdopost="init";
Log.i("inside doinbackground 1st",flagdopost);
}
else if(params[0].equalsIgnoreCase(""))
{
flagdopost="";
j++;
if(j!=1)
{
firequery();
flagdopost="itemselected";
Log.i("inside doinbackground 2nd",flagdopost);
}
}
else if(params[0].equalsIgnoreCase("itemclick"))
{
x=params[1];
y=params[2];
for(int i=0;i<restaurantidlist.size();i++)
{
if((params[1].toString()).equalsIgnoreCase(restaurantnames.get(i)))
{
sendid=restaurantidlist.get(i);
}
}
Log.i("in do in backgroung idforbundle is", sendid);
flagdopost="itemclicked";
}
return null;
}
public void onPostExecute(Void result)
{
if(flagdopost.equalsIgnoreCase("init"))
{
city.setText(cityname);
ArrayAdapter<String> adaptercuisine=new ArrayAdapter<String>(Restaurantlist.this,android.R.layout.simple_spinner_item,tempcuisinenamelist);
adaptercuisine.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ArrayAdapter<String> adapterarea=new ArrayAdapter<String>(Restaurantlist.this,android.R.layout.simple_spinner_item,tempareanamelist);
adapterarea.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
area.setAdapter(adapterarea);
area.setSelection(0);
cuisine.setAdapter(adaptercuisine);
cuisine.setSelection(0);
area.setOnItemSelectedListener(Restaurantlist.this);
cuisine.setOnItemSelectedListener(Restaurantlist.this);
}
else if(flagdopost.equalsIgnoreCase("itemselected"))
{
customlist.clear();
populateReslist();
restaurant.invalidateViews();
restaurant.setAdapter(new SimpleAdapter(Restaurantlist.this,customlist,R.layout.customlistrow,new String[] {"Restaurant Name","Area Name"},
new int[] {R.id.tvresname,R.id.tvareaname})
{
@Override
public View getView(int position, View convertView,ViewGroup parent)
{
View view =super.getView(position, convertView, parent);
return view;
}
});
}
else if(flagdopost.equalsIgnoreCase("itemclicked"))
{
Bundle bundle=new Bundle();
bundle.putString("locid",sendid);
Toast.makeText(getBaseContext(), "locId in dopost new one"+sendid, 10).show();
Intent resdetail = new Intent(Restaurantlist.this,Restaurantdetail.class);
resdetail.putExtras(bundle);
startActivity(resdetail);
}
pg.dismiss();
}
}
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
switch(arg0.getId())
{
case R.id.spncuisine:
asynctaskflag="";
if(cuisine.getSelectedItem().toString()!="All")
{
cuisineval=cuisine.getSelectedItem().toString();
}
else
{
cuisineval="*";
}
new Thetask().execute(asynctaskflag,null,null);
break;
case R.id.spnarea:
asynctaskflag="";
if(area.getSelectedItem().toString()!="All")
{
areaval=area.getSelectedItem().toString();
}
else
{
areaval="*";
}
new Thetask().execute(asynctaskflag,null,null);
break;
}
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:1)
尝试在AsyncTask中声明ProgressDialog。而不是作为活动成员变量。
public class Thetask extends AsyncTask<String, Void, Void>
{
ProgressDialog pg = null;
String x,y;
@Override
public void onPreExecute()
...