我正在编写一个应用程序,在许多点上将尝试从网站检索帐户信息。我想编写一个函数(“getAccount()
”)来执行以下操作:
从页面获取数据我没有问题;我遇到的问题是整个“显示对话框/等待完成/返回控制到调用函数”部分。 ProgressDialog根本不显示,或者函数在从站点发出数据请求后立即返回给调用者,而没有给它足够的时间来检索数据。
非常感谢任何帮助。
编辑:我在下面添加了一些代码,用于我对AsyncTask的处理。请注意,我在grabURL()中有一行MsgBox("done")
;这只是一个Toast电话。当我运行此代码时,在仍然发出HTTP请求时会弹出“done”。此MsgBox行仅存在,因此我可以看到grabURL
是否正在等待GrabURL
完成(不是这样)。
public void grabURL() {
new GrabURL().execute();
MsgBox("done");
}
private class GrabURL extends AsyncTask<String, Void, Void> {
private ProgressDialog Dialog = new ProgressDialog(MyContext);
protected void onPreExecute() {
Dialog.setTitle("Retrieving Account");
Dialog.setMessage("We're retrieving your account information. Please wait...");
Dialog.show();
}
protected Void doInBackground(String... urls) {
try {
// Get account info from the website
String resp = GetPage(ThePage); // I have this classed out elsewhere
// Some other code that massages the data
AccountRetrievalSuccess = true;
} catch (Exception e) {
AccountRetrievalSuccess = false;
}
return null;
}
protected void onPostExecute(Void unused) {
Dialog.dismiss();
}
}
答案 0 :(得分:1)
出现消息框,因为AsyncTask正在使用单独的线程来运行doInBackground。执行调用不会阻塞。您可以在调用dismiss之后将消息框移至onPostExecute。小费。您可能希望在onPause中调用progress.cancel,否则您可能会在方向更改时遇到不需要的行为。最后,如果要在doInBackground中检索信息,请考虑在doInBackground中返回信息。信息将传递给onPostExecute。因此,如果信息是对象MyInfo,请考虑:
private class GrabURL extends AsyncTask<String, Void, MyInfo> {
答案 1 :(得分:0)
在没有看到某些代码的情况下无法肯定地说,但是当你想要同步调用(它将阻止并等待返回数据)到网站时,听起来你正在对网站进行异步调用。
答案 2 :(得分:0)
您想使用AsyncTask,在onPreExecute中生成非用户可取消的ProgressDialog,在doInBackground中执行您的工作,并在onPostExecute中将其关闭。
这样的事情:
public class MyApp extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// blah blah blah
URL url;
try
{
url = new URL("http://example.com");
new MyTask().execute(url);
}
catch (MalformedURLException e)
{
}
}
protected void doSomeStuff()
{
// stuff to do after the asynctask is done
}
protected void throwAWobbly()
{
// stuff to do if you didn't get the data
}
// inner class to do the data getting off the UI thread,
// so android doesn't "not responding" kill you
private class MyTask extends AsyncTask<URL, Void, Boolean>
{
private ProgressDialog dialog;
private boolean gotData = false;
protected void onPreExecute()
{
// create a progress dialog
dialog = ProgressDialog.show(MyApp.this, "",
"Doing stuff. Please wait...", false, false);
}
protected Boolean doInBackground(URL... urls)
{
// get your data in here!
return gotData;
}
protected void onPostExecute(Boolean result)
{
// get rid of the progress dialog
dialog.dismiss();
if (true == result)
{
// got all data!
doSomeStuff();
}
else
{
// oops!
throwAWobbly();
}
}
}
}