[英]Android Endless loop Progress Dialog AsyncTask
我的負載不盡,GridView沒有顯示。 我的xml網址正在運行,並且一切正常。 我的代碼有問題嗎? 我剛剛修改了一些代碼,我試圖在這里學習Asynctask。 請幫我
CustomizedListView.class
public class CustomizedListView extends Activity {
// All static variables
private ProgressDialog pDialog;
static final String URL = "http://XXXXXX";
// XML node keys
ArrayList<HashMap<String, String>> songsList;
static final String KEY_SONG = "song"; // parent node
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";
static final String KEY_DURATION = "duration";
static final String KEY_THUMB_URL = "thumb_url";
static String IMAGE_POSITION;
GridView grid;
LazyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
//StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
//StrictMode.setThreadPolicy(policy);
songsList = new ArrayList<HashMap<String, String>>();
new loadGridView().execute();
grid = (GridView) findViewById(R.id.grid_view);
grid.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String title = ((TextView) view.findViewById(R.id.title)).getText().toString();
String artist = ((TextView) view.findViewById(R.id.artist)).getText().toString();
String url = ((TextView) view.findViewById(R.id.duration)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),SingleMenuItemActivity.class);
in.getIntExtra(IMAGE_POSITION, position);
in.putExtra(KEY_TITLE, title);
in.putExtra(KEY_ARTIST, artist);
in.putExtra(KEY_THUMB_URL,url);
startActivity(in);
}
});
}
class loadGridView extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(
CustomizedListView.this);
pDialog.setMessage("Loading websites ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... args) {
// updating UI from Background Thread
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_SONG);
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
// adding HashList to ArrayList
songsList.add(map);
}
return null;
}
@Override
protected void onPostExecute(String args) {
// dismiss the dialog after getting all products
adapter=new LazyAdapter(CustomizedListView.this, songsList);
grid.setAdapter(adapter);
pDialog.dismiss();
}
}
}
你必須用
adapter = new LazyAdapter(Activityname.this,songsList);
您根本沒有使用doInbackground的功能。 由於您再次調用runOnuithread。 去掉它。
將適配器相關的調用移到Ui線程可能在OnpostExecute中
使用上下文
public LazyAdapter(Context context, ArrayList<HashMap<String, String>> d) {
context = context;
data=d;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(context.getApplicationContext());
}
並將Context引用放到您的AsyncTask構造函數中。 我想最好的方法來填充您的適配器
void onPostExecute(String args) {
// fill your adapter here
}
而是doInBackground();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.