Setting up async task for loading Json into a listview

前端 未结 5 1713
予麋鹿
予麋鹿 2020-12-09 23:22

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

相关标签:
5条回答
  • 2020-12-09 23:30

    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;
      ....   
    }
    
    0 讨论(0)
  • 2020-12-09 23:35

    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();
     ...
    
    0 讨论(0)
  • 2020-12-09 23:42

    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

    0 讨论(0)
  • 2020-12-09 23:49

    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

    0 讨论(0)
  • 2020-12-09 23:50

    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)

    0 讨论(0)
提交回复
热议问题