I take json object generate from a PHP script on my server and then parse it into a listview using a lazy load for the images. The problem is that the json will load relativ
The onPreExecute , onPostExecute of AsyncTask will run in the UI thread, the doInBackground will run in another thread, so below code should just fine for you
public class YourActivity extends Activiy{
public void getJson(String selection, String url) {
new LoadJsonTask().execute( selection, url);
}
private class LoadJsonTask extends AsyncTask<String, Void, ArrayList<HashMap<String, String>> > {
ProgressDialog dialog ;
protected void onPreExecute (){
dialog = ProgressDialog.show(YourActivity.this ,"title","message");
}
protected ArrayList<HashMap<String, String>> doInBackground (String... params){
return doGetJson(params[0],params[1]);
}
protected void onPostExecute(ArrayList<HashMap<String, String>> mylist){
ListAdapter adapter = new JsonAdapter(YourActivity.this, mylist, R.layout.list,
new String[] { "name", "text", "ts"}, new int[] { R.id.item_title,
R.id.item_subtitle, R.id.timestamp});
setListAdapter(adapter);
dialog.dismiss();
}
}
public ArrayList<HashMap<String, String>> doGetJson(String selection, String url) {
JSONObject json = null;
String formatedcat = selection.toLowerCase();
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
json = JSONfunctions
.getJSONfromURL(url);
try {
//the array title that you parse
JSONArray category = json.getJSONArray(formatedcat);
for (int i = 0; i < category.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject c = category.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("name",
c.getString("title"));
//map.put("text",c.getString("title"));
map.put("ts",c.getString("run_date") );
map.put("image","http:"+c.getString("url"));
mylist.add(map);
}
} catch (JSONException e) {
}
return mylist;
....
}
Here is a simple thread that will display an indeterminate ProgressDialog while you fetch your data and then dismiss itself once the thread is finished executing.
...
final ProgressDialog pd = ProgessDialog.show(this, "some title", "some message", true);
Thread t = new Thread(new Runnable(){
@Override
public void run(){
//your code
....
pd.dimiss();
}
});
t.start();
...
If you want to use thread then this is simple solution
public class ActivityClass extends Activity implements Runnable, OnItemClickListener {
ProgressDialog pd;
ListView list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list=(ListView) findViewById(R.id.listview);
list.setOnItemClickListener(this);
pd=new ProgressDialog(this);
pd.setTitle("Please wait");
pd.setMessage("Loading....");
pd.setCancelable(false);pd.show();
Thread th=new Thread(this);
th.start();
}
AlertDialog dialog1;
private ArrayList<String> titleVal=new ArrayList<String>();
private ArrayList<String> pubDateVal=new ArrayList<String>();
private ArrayList<String> linkVal=new ArrayList<String>();
@Override
public void run() {
GetTheFout();
}
/**
* Update If Needed
*/
ArrayList<Long> count;
AdapterClass adb;
public void GetTheFout(){
try{
Do json parsing here and store values in arraylist,
}
hanlder.sendEmptyMessage(sendMsg);
}
private Handler hanlder=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
adb=new AdapterClass(BBNewsMain.this,titleVal,pubDateVal);
list.setAdapter(adb);
}
};
// BroadCast broad;
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
try{
///Handle click event here
}catch(ArrayIndexOutOfBoundsException e){
e.getMessage();
}
}
}
Note Never Update UI inside thread.That's why i have taken one handler class.After executing thread it will come to handler then set all value to list adapter and dismiss Progress Dialog
Here's what you're looking for: progressDialog in AsyncTask check out the answer with most upvotes, should give you an idea on how to do async with progress dialog. Also, if you're totally unfamiliar with AsyncTask, check out this
Once you have your asynctask running successfully, it might be worth your while to change your listview to use fragments instead. In doing so, you get a nice spinning progress wheel if the list's adapter is currently empty.
This happens when you use the default list view item, or including the list_content
layout in your custom layout.
Best way to do this is create your activty, start your asynctask and in the task's onpostexecute
method, set the listfragment's adapter up. This way you'll get a nice loading screen while your data is downloaded.
See: http://developer.android.com/reference/android/app/ListFragment.html#setListShown(boolean)