Android ProgressDialog进度条按正确顺序执行操作
我刚收到这个,但是我在事情的顺序上有一个小问题。 具体来说,在my thread()中,我设置了一个微调器使用的数组。问题是微调器基本上是在my thread()完成之前设置好并完成的,所以它使用空数组进行设置 如何将微调器ArrayAdapter与另一个线程正在加载的数组相关联 我已经将代码缩减到我认为理解问题所必需的程度,但是如果需要更多,请告诉我。无论是否调用refreshData(),都会出现问题 同样,有时我想从菜单中调用loadData()。直接跟随loadData()如果我试图在下一行触发祝酒词,这将导致forceclose,这也是因为我如何实现ProgressDialog 谢谢你的关注Android ProgressDialog进度条按正确顺序执行操作,android,multithreading,progress-bar,progressdialog,Android,Multithreading,Progress Bar,Progressdialog,我刚收到这个,但是我在事情的顺序上有一个小问题。 具体来说,在my thread()中,我设置了一个微调器使用的数组。问题是微调器基本上是在my thread()完成之前设置好并完成的,所以它使用空数组进行设置 如何将微调器ArrayAdapter与另一个线程正在加载的数组相关联 我已经将代码缩减到我认为理解问题所必需的程度,但是如果需要更多,请告诉我。无论是否调用refreshData(),都会出现问题 同样,有时我想从菜单中调用loadData()。直接跟随loadData()如果我试图在下
public class CMSHome extends Activity {
private static List<String> pmList = new ArrayList<String>();
// Instantiate helpers
PMListHelper plh = new PMListHelper();
ProjectObjectHelper poc = new ProjectObjectHelper();
// These objects hold lists and methods for dealing with them
private Employees employees;
private Projects projects;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Loads data from filesystem, or webservice if necessary
loadData();
// Capture spinner and associate pmList with it through ArrayAdapter
spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item,
pmList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
//---the button is wired to an event handler---
Button btn1 = (Button)findViewById(R.id.btnGetProjects);
btn1.setOnClickListener(btnListAllProjectsListener);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
private void loadData()
{
final ProgressDialog pd = ProgressDialog.show(this,
"Please wait", "Loading Data...", true, false);
new Thread(new Runnable(){
public void run(){
employees = plh.deserializeEmployeeData();
projects = poc.deserializeProjectData();
// Check to see if data actually loaded, if not then refresh
if ((employees == null) || (projects == null)) {
refreshData();
}
// Load up pmList for spinner control
pmList = employees.getPMList();
pd.dismiss();
}
}).start();
}
private void refreshData()
{
// Refresh data for Projects
projects = poc.refreshData();
poc.saveProjectData(mCtx, projects);
// Refresh data for PMList
employees = plh.refreshData();
plh.savePMData(mCtx, employees);
}
}
公共类CMSHome扩展活动{
私有静态列表pmList=new ArrayList();
//实例化帮助程序
PMListHelper plh=新的PMListHelper();
ProjectObjectHelper poc=新的ProjectObjectHelper();
//这些对象包含用于处理它们的列表和方法
私人雇员;
私人项目;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//从文件系统或Web服务加载数据(如果需要)
loadData();
//捕获微调器并通过ArrayAdapter将pmList与其关联
微调器=(微调器)findViewById(R.id.spinner);
ArrayAdapter适配器=新的ArrayAdapter(
这个,android.R.layout.simple\u微调器\u项,
pmList);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
//---该按钮连接到事件处理程序---
按钮btn1=(按钮)findViewById(R.id.btnGetProjects);
btn1.setOnClickListener(btnListAllProjectsListener);
spinner.setOnItemSelectedListener(新的MyOnItemSelectedListener());
}
私有void loadData()
{
最终ProgressDialog pd=ProgressDialog.show(此,
“请稍候”,“正在加载数据…”,对,错);
新线程(newrunnable()){
公开募捐{
employees=plh.deserializeEmployeeData();
projects=poc.deserializeProjectData();
//检查数据是否实际加载,如果没有,则刷新
if((employees==null)| |(projects==null)){
刷新数据();
}
//加载微调器控制的pmList
pmList=employees.getPMList();
pd.解散();
}
}).start();
}
私有数据()
{
//刷新项目的数据
projects=poc.refreshData();
poc.saveProjectData(mCtx,项目);
//刷新PMList的数据
employees=plh.refreshData();
plh.savePMData(mCtx,员工);
}
}
根据Jims的建议,我尝试将onCreate()更改为以下内容。不确定我是否做对了,仍然不起作用:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mCtx = this;
// Loads data from filesystem, or webservice if necessary
// Would like to extend this to update if files are over x days old
final ProgressDialog pd = ProgressDialog.show(this,
"Please wait", "Loading Data...", true, false);
new Thread(new Runnable(){
public void run(){
employees = plh.deserializeEmployeeData();
projects = poc.deserializeProjectData();
// Check to see if data actually loaded, if not then refresh
if ((employees == null) || (projects == null)) {
refreshData();
}
pd.dismiss();
runOnUiThread(new Runnable() {
public void run(){
// Load up pmList for spinner control
pmList = employees.getPMList();
}
});
}
}).start();
spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, pmList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
//---the button is wired to an event handler---
Button btn1 = (Button)findViewById(R.id.btnGetProjects);
btn1.setOnClickListener(btnListAllProjectsListener);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mCtx=这个;
//从文件系统或Web服务加载数据(如果需要)
//如果文件超过x天,是否要扩展此功能以更新
最终ProgressDialog pd=ProgressDialog.show(此,
“请稍候”,“正在加载数据…”,对,错);
新线程(newrunnable()){
公开募捐{
employees=plh.deserializeEmployeeData();
projects=poc.deserializeProjectData();
//检查数据是否实际加载,如果没有,则刷新
if((employees==null)| |(projects==null)){
刷新数据();
}
pd.解散();
runOnUiThread(新的Runnable(){
公开募捐{
//加载微调器控制的pmList
pmList=employees.getPMList();
}
});
}
}).start();
微调器=(微调器)findViewById(R.id.spinner);
ArrayAdapter适配器=新的ArrayAdapter(
这个,android.R.layout.simple\u微调器\u项目,pmList);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
//---该按钮连接到事件处理程序---
按钮btn1=(按钮)findViewById(R.id.btnGetProjects);
btn1.setOnClickListener(btnListAllProjectsListener);
spinner.setOnItemSelectedListener(新的MyOnItemSelectedListener());
}
哇,我花了很长时间才找到解决办法,但我很高兴终于找到了解决办法 使用后台线程更新微调器可以通过使用处理程序来完成。线程的主要工作完成后,将调用处理程序
mProgressDlg = ProgressDialog.show(this, "App_Name", "Loading data...",
true, false);
new Thread(new Runnable(){
public void run() {
/*Load Data, set pmList in my case*/
mProgressDlg.dismiss();
hRefresh.sendEmptyMessage(REFRESH);
}
}).start();
Handler hRefresh = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case REFRESH:
spinner = (Spinner) findViewById(R.id.spinner);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
mCtx, android.R.layout.simple_spinner_item, pmList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
break;
}
}
};
mProgressDlg=ProgressDialog.show(此“应用程序名称”、“加载数据…”,
正确的,错误的);
新线程(newrunnable()){
公开募捐{
/*加载数据,在我的案例中设置pmList*/
mProgressDlg.disclose();
hRefresh.sendEmptyMessage(刷新);
}
}).start();
Handler hRefresh=new Handler(){
@凌驾
公共无效handleMessage(消息消息消息){
开关(msg.what){
案例刷新:
微调器=(微调器)findViewById(R.id.spinner);
最终ArrayAdapter适配器=新的ArrayAdapter(
mCtx,android.R.layout.simple\u微调器\u项目,pmList);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
spinner.setOnItemSelectedListener(新的MyOnItemSelectedListener());
打破
}
}
};
感谢bhatt4982和他对loa后所有工作的回答
public class Start extends Activity {
private static final String TAG = "PriceList";
ArrayAdapter<ProductCategory> category_adapter;
ArrayAdapter<ProductGroup> group_adapter;
ArrayList<ProductCategory> categories;
ArrayList<ProductGroup> groups;
ArrayList<Price> prices;
Spinner group_spinner;
Spinner category_spinner;
ProgressDialog progressDialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
group_spinner = (Spinner) findViewById(R.id.group_spinner);
category_spinner = (Spinner) findViewById(R.id.category_spinner);
// product category spinner
categories = new ArrayList<ProductCategory>();
category_adapter = new CustomArrayAdapter<ProductCategory>(categories);
category_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// load category spinner from database
loadCategory(); // adapter MUST be setup before this is called
category_spinner.setAdapter(category_adapter);
category_spinner.setOnItemSelectedListener(new OnItemSelectedListener () {
..... other stuff ......
private final Handler handler = new Handler() {
@Override
public void handleMessage(final Message msg) {
Log.v(TAG, "worker thread done, setup adapter");
switch (msg.what) {
case Constants.CATEGORIES:
category_adapter.notifyDataSetChanged();
break;
case Constants.GROUPS:
group_adapter.notifyDataSetChanged();
break;
case Constants.PRICES:
startActivity(new Intent(Start.this, ShowPrices.class));
break;
default:
}
// dismiss dialog
progressDialog.dismiss();
}
};
// loadCategory() essentially the same....
private void loadGroup(final String cat) {
Log.v(TAG, "loadGroup");
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Retrieving Product Groups...");
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.show();
new Thread() {
@Override
public void run() {
int count = 100;
int i = 0;
SQLiteDatabase db = DbUtils.getStaticDb();
Cursor c = db.rawQuery("select count(*) from productgroup where category = \'"
+ cat + "\';", null);
c.moveToFirst();
if (!c.isAfterLast()) {
count = c.getInt(0);
}
c.close();
progressDialog.setMax(count);
groups.clear();
groups.add(new ProductGroup("-1", "--- Select ---"));
StringBuilder sb = new StringBuilder("select _id,description from productgroup");
sb.append(" where category = \'");
sb.append(cat);
sb.append("\' order by description;");
Log.v(TAG, sb.toString());
c = db.rawQuery(sb.toString(), null);
c.moveToFirst();
while (!c.isAfterLast()) {
Log.v(TAG, c.getString(0));
groups.add(new ProductGroup(c.getString(0), c.getString(1)));
i++;
if (i % 5 == 0) {
progressDialog.setProgress(i);
}
c.moveToNext();
}
c.close();
// tell UI thread OK
handler.sendEmptyMessage(Constants.GROUPS);
}
}.start();
}
// custom ArrayAdapter allows us to have our own ArrayList<T>
class CustomArrayAdapter<T> extends ArrayAdapter<T> {
CustomArrayAdapter(ArrayList<T> list) {
super(Start.this, android.R.layout.simple_spinner_item, list);
}
}
protected class DoHeavyWorkAsync extends AsyncTaskEx<Void, Integer, String> {
private static final String TAG = "DoHeavyWorkAsync";
@Override
protected String doInBackground(Void... arg0) {
// do heavy work here. e.g. loadDataFromSomewhere();
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
// you can do ui work on the main activity from here
}
});
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "onPreExecute()");
//e.g. display "loading..."
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d(TAG, "onPostExecute()");
}
}
(new DoHeavyWorkAsync()).execute();