我正在尝试从互联网上获取数据,解析它然后向用户显示数据。该操作通常需要3秒左右,我想一个微调器ProgressDialog显示一条消息,说我正在加载数据。问题是ProgressDialog仅在加载几乎完成时显示。这是我的代码
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button load_routes = (Button)findViewById(R.id.load_routes);
load_routes.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
task_complete = false;
progressBar = new ProgressDialog(v.getContext());
progressBar.setCancelable(false);
progressBar.setMessage("Fetching routes data ...");
progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressBar.show();
if(haveNetworkConnection())
{
loading_routes_data(v);
}
else
{
progressBar.dismiss();
}
}
});
}
这是我的函数,被称为onclick
private void loading_routes_data(View v)
{
try
{
new Thread(new Runnable()
{
public void run()
{
while(!task_complete)
{
refresh_routes();
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
runOnUiThread(new Runnable()
{
public void run()
{
progressBar.dismiss();
}
});
}
}).start();
}
catch(Exception e)
{
}
while(!task_complete)
{
}
}
我的refresh_routes()
函数获取数据,解析它然后将task_complete
设置为true
,我甚至不确定是否应该将它保留在while循环中。< / p>
这是我的大问题。我希望在点击按钮时立即显示ProgressDialog
,然后我想致电refresh_routes()
,一旦refresh_routes()
完成,我想摆脱进度对话框。但我不确定如何去做。
如果有人可以告诉我如何以某篇文章作为例子来解决问题,那么我将非常感激。提前谢谢你:)
答案 0 :(得分:2)
您通过在方法结束时调用while(!task_complete)
来锁定UI线程。你真的应该使用AsyncTask
进行这样的操作。这是AsyncTask
应该是这样的:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
private Context context;
public MyAsyncTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show( context, null, "Fetching routes data ..." );
}
@Override
protected Void doInBackground( Void... params ) {
while (!task_complete) {
refresh_routes();
try {
Thread.sleep( 1000 );
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute( Void result ) {
super.onPostExecute( result );
progressDialog.dismiss();
}
}
要执行此操作,您可以这样做:
new MyAsyncTask( this ).execute();
我不确定您的refresh_routes()
方法是如何工作的,但您可以考虑在doInBackground()
方法中移动它的功能。
答案 1 :(得分:1)
使用AsyncTask执行此操作。它为您提供了在Activity中执行多线程的强大功能。