Мне нужна помощь для многопоточности и ProgressDialog, когда я вызываю базу данных - PullRequest
0 голосов
/ 16 июня 2011

Я создаю приложение для корпоративных событий, я получил события из базы данных и заполнил его в адаптере для ListView, мне нужно отобразить ProgressDialog во время извлечения данных из базы данных, это мой код `

@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 {
                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();

`

Ответы [ 4 ]

1 голос
/ 16 июня 2011

Я бы нам AsyncTask .Вот структура того, что должно произойти.

    @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();
}
1 голос
/ 16 июня 2011

То, что я говорю, это использовать AsyncTask () .. показывать диалог ypur в preExecute () и отклонять в postexecute (); .. и код извлечения данных, который вы помещаете в задание backGround ... я имею в виду, как показано ниже ... это пример кода, который я использовал в своем проекте

класс Backgrountask расширяет 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;
    }

}

    }
0 голосов
/ 16 июня 2011

Вам необходимо прочитать о несинхронизированных вызовах WS и о том, как динамически заполнять данные в виде списка.Ниже приведен фрагмент кода, который работает и гарантирует, что не имеет значения, сколько времени занимает WS CAll, нет прерывания в графическом интерфейсе и поток работает гладко:

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

        }
    };
0 голосов
/ 16 июня 2011

Переместите

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

в Handler и вызовите метод sendEmptyMessage() из Handler из Thread.run() после получения Adapter.

Рассмотрите этот пост для получения дополнительной информации

Edit:

Ваш код должен выглядеть примерно так.

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();

Где ваш обработчик будет обновлять список. Но ответ devA - лучший способ сделать такую ​​работу.

...