我有一个应用程序,它将JSON订阅源的信息加载到列表视图中。这需要一些时间来加载,所以我想设置一个进度条,让用户知道应用程序正在做些什么。我是否必须实现一个AsyncTask,或者有一种简单的方法来让旋转进度图标在列表加载时出现?我假设我需要将进度对话代码放入我加载的任务中。这是我的listview的代码。打开Json进度列表视图时的进度对话框
public class Schedule extends ListActivity {
protected EditText searchText;
protected SQLiteDatabase db;
protected Cursor cursor;
protected TextView textView;
protected ImageView imageView;
protected ArrayList<HashMap<String, String>> myList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.schedule);
View layout = findViewById(R.id.gradiant);
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM, new int[] {
0xFF95B9C7, 0xFF06357A });
gd.setCornerRadius(2f);
layout.setBackgroundDrawable(gd);
myList = new ArrayList<HashMap<String, String>>();
JSONObject jsonObjSend = new JSONObject();
JSONObject json = JSONfunctions
.getJSONfromURL("myAPIURL");
try {
JSONArray current = json.getJSONArray("d");
for (int i = 0; i < current.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = current.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("showid", "" + Html.fromHtml(e.getString("ShowID")));
map.put("name", "" + Html.fromHtml(e.getString("Title")));
map.put("showvenue", "" + e.getString("ShowVenue"));
map.put("subtitle", "" + Html.fromHtml(e.getString("SubTitle")));
map.put("venueid", "" + e.getString("VenueID"));
String showDate = e.getString("ShowDate");
long epoch = Long.parseLong(showDate);
Date showDatePresent = new Date(epoch * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("E, MMMM d");
String dateOfShow = sdf.format(showDatePresent);
map.put("showdate", "" + dateOfShow);
String showStart = e.getString("ShowStart");
long epoch2 = Long.parseLong(showStart);
Date showTimePresent = new Date(epoch2 * 1000);
SimpleDateFormat sdf2 = new SimpleDateFormat("h:mm a");
String timeOfShow = sdf2.format(showTimePresent);
map.put("showstart", "" + timeOfShow);
String showEnd = e.getString("ShowEnd");
long epoch3 = Long.parseLong(showEnd);
Date showEndPresent = new Date(epoch3 * 1000);
SimpleDateFormat sdf3 = new SimpleDateFormat("h:mm a");
String endOfShow = sdf3.format(showEndPresent);
map.put("showend", "" + endOfShow);
String gatesOpen = e.getString("GatesOpen");
long epoch4 = Long.parseLong(gatesOpen);
Date gatesOpenPresent = new Date(epoch4 * 1000);
SimpleDateFormat sdf4 = new SimpleDateFormat(
"'Gates open: 'h:mm a");
String gatesAreOpen = sdf4.format(gatesOpenPresent);
map.put("gatesopen", "" + gatesAreOpen);
map.put("aboutartist", "" + e.getString("AboutArtist"));
map.put("program", "" + Html.fromHtml(e.getString("Program")));
map.put("programnotes",
"" + Html.fromHtml(e.getString("ProgramNotes")));
map.put("pricing", "" + Html.fromHtml(e.getString("Pricing")));
map.put("featuring", "" + e.getString("Featuring"));
map.put("parkdetails", "" + e.getString("ParkDetails"));
map.put("starred", "" + e.getString("Starred"));
map.put("image500", "" + e.getString("Image500"));
map.put("image250", "" + e.getString("Image250"));
map.put("aboutartist",
"" + Html.fromHtml(e.getString("AboutArtist")));
myList.add(map);
}
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
ListAdapter adapter = new SimpleAdapter(this, myList,
R.layout.line_item, new String[] { "name", "showdate",
"showstart", "showvenue" }, new int[] { R.id.title,
R.id.showdate, R.id.showstart, R.id.showvenue });
setListAdapter(adapter);
final ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
HashMap<String, String> hashMap = myList.get(position);
// hashMap.put("map", hashMap);
Intent intent = new Intent(getApplicationContext(),
ArtistDetails.class);
intent.putExtra("map", hashMap);
startActivity(intent);
}
});
}
public void featured(View view) {
startActivity(new Intent(getApplicationContext(), Featured.class));
}
public void schedule(View view) {
startActivity(new Intent(getApplicationContext(), Schedule.class));
}
public void venue(View view) {
startActivity(new Intent(getApplicationContext(), Venues.class));
}
public void share(View view) {
startActivity(new Intent(getApplicationContext(), Friends.class));
}
public void myravinia(View view) {
startActivity(new Intent(getApplicationContext(), Account.class));
}
希望我的问题很明确,让我知道你是否需要我显示任何其他细节。
即使您不想实现进度对话框,仍应设置异步任务。从UI线程获取和处理JSONP将锁定用户界面 - 这不仅会导致糟糕的用户体验,还会导致您的应用被Android强制关闭。 – xbonez 2012-03-12 17:22:20
这是很好的知道。获取进度图标作为ListView加载后,我需要将图像包含到来自url字符串的每个行项目中。你知道用json feed解释AsyncTask有什么好处吗? – KSol 2012-03-12 17:41:36
Android有一些关于异步任务的可靠文档:http://developer.android.com/reference/android/os/AsyncTask.html。 – xbonez 2012-03-12 17:44:13