开发者

I need help for threading and ProgressDialog when i call the database

Am building application for company events , i got the events from database and fill it in the adapter for ListView, i need to display ProgressDialog during the retrieving data from database , this is my code `

@Override

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listlayout);
    adapter = new MyArrayAdapter(this);
    listView = (ListView) findViewById(R.id.list);
    progressDialog = ProgressDialog.show(this, "Please wait....",
            "Here your message");
    new Thread(new Runnable() {
        public void run() {
            try {
             开发者_StackOverflow   Thread.sleep(2000);
                //this is call the webservice to got filled adapter 
                adapter = new EventWebservice().getAdapter(this);
                listView.setAdapter(adapter);
                progressDialog.dismiss();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    adapter.notifyDataSetChanged();
    adapter.notifyDataSetInvalidated();

`


What i say is make use of AsyncTask().. show ypur dialog in preExecute() and dismiss in postexecute();.. and the data fetching code u put in backGround task.. i mean like below.. this is a sample code i ve used in my project

class Backgrountask extends AsyncTask {

    @Override
    protected void onPostExecute(Object result) {
        dialog.dismiss();
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(Mwfa.this, "", 
                "Loading. Please wait...", true);
        super.onPreExecute();
    }

    @Override
    protected Object doInBackground(Object... arg0) {
        //your code
        }
        return null;
    }

}

    }


I would us a AsyncTask. Here is the structure of what should happen.

    @Override
protected void onPreExecute() {
    dialog = ProgressDialog.show(context, "", "Loading. Please wait...",
            true);
}

@Override
protected EventWebservice doInBackground(Void... params) {
         //call the webservice and return it
}

@Override
protected void onPostExecute(EventWebservice webservice) {
    adapter = webservice.getAdapter(this);;
            listView.setAdapter(adapter);
    dialog.dismiss();
}


You need to read on unsynchronized ws calls and how to fill up data in a listview dynamically. Here is the code snippet below that works and will ensure that no mattter how much time the WS CAll takes there is no interruption on the GUI and the flow is smooth:

String wsResponse[];

public void sampleFunction()
    {


        progressDialog = ProgressDialog.show(this, "", "Getting backup list...");
        new Thread() {
            public void run() {
                try {
                    //do the ws call and store the ws response in a string array 
                    wsResponse=wsCall();

                }catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                messageHandler.sendEmptyMessage(0);
                //              messageHandler.sendEmptyMessage(0);
            }
        }.start();
    }
}


//inside the handler set the string array retrieved from the WS in sampleFunction to the adapter
private Handler messageHandler = new Handler() {

        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //here write the code to assign the string array to the adapter

        }
    };


Move your

listView.setAdapter(adapter);
progressDialog.dismiss();
adapter.notifyDataSetChanged();

into a Handler and call the method sendEmptyMessage() of Handler from the Thread.run() after you got the Adapter.

Consider this post for more information

Edit:

Your code should be look like something this.

new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(2000);
                //this is call the webservice to got filled adapter 
                adapter = new EventWebservice().getAdapter(this);
                handler.sendEmptyMessage(0);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

Where your Handler will update the list. But devA's answer is best way to do such jobs.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜