我有两个无效的AsyncTask。我做错了必须有一些共同之处。
我的第一个活动需要很长时间才能加载,所以我希望有一个progressDialog / Bar,但它失败了。我使用
访问onCreate中的AsyncTasknew HeavyWorker(this).execute();
public class HeavyWorker extends AsyncTask < String , Context , Void > {
private ProgressDialog progressDialog ;
private Context targetCtx ;
public HeavyWorker ( Context context ) {
this.targetCtx = context ;
// this.needToShow = true;
progressDialog = new ProgressDialog ( targetCtx ) ;
progressDialog.setCancelable ( false ) ;
progressDialog.setMessage ( "Retrieving data..." ) ;
progressDialog.setTitle ( "Please wait" ) ;
progressDialog.setIndeterminate ( true ) ;
}
@ Override
protected void onPreExecute ( ) {
progressDialog.show ( ) ;
}
@ Override
protected Void doInBackground ( String ... params ) {
// Do Your WORK here
以下这些行在正常情况下工作正常 “public void onCreate(Bundle savedInstanceState)”area
Ls = new LoadSettings(CreateAppointment.this);
gs = new GlobalSubs();
TimeZoneList();
这一行动态填充一个Spinner框并阻止它工作,所以我对它进行了评论。
// createTimezone();
ZoneList(Ls.getCountryZone());
这一行还动态填充了一个spinnerbox,所以我评论了它
// createZone();
InitialiseUI();
CreateFileName();
return null ;
}
这个区域永远不会到达?
@ Override
protected void onPostExecute ( Void result ) {
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss ( ) ;
}
}
}
我的第二页失败了同样的问题。
我也尝试过一个代码略有不同的设置页面。
现已修复:
//
private class MyClass extends AsyncTask<Void, Void, Void>{
ProgressDialog mProgressDialog;
public MyClass(){
mProgressDialog = new ProgressDialog(Preferences.this);
mProgressDialog.setMessage ("Please Wait While Saving");
mProgressDialog.setTitle("Saving");
//
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show(Preferences.this, "Saving", "Please Wait a Sec");
}
@Override
protected Void doInBackground(Void... params)
{
saveSettings();
return null;
}
@Override
protected void onPostExecute(Void unused) {
唯一可行的方法是当我注释掉该行并更改为其他活动时
// mProgressDialog.dismiss();
Toast.makeText(Preferences.this, "Your Settings Where Saved.", Toast.LENGTH_SHORT).show();
gotoMainPage();
}
}
private void gotoMainPage(){
Intent a = new Intent(this, Main_entry.class);
finish();
startActivity(a);
}
答案 0 :(得分:1)
你不应该在后台对UI做任何事情。 doInBackground()
在后台线程上运行。如果您需要在后台处理过程中更新用户界面,请使用publishProgress()
(和onProgressUpdate()
)。
在我看来,你仍然在尝试在这里执行UI操作:
// createZone();
InitialiseUI();
CreateFileName();
我不知道InitialiseUI()
做了什么,但它听起来像UI-ish。如果您需要UI设置,请在preExecute()
中执行此操作,该操作在UI线程上调用。
您可以在doInBackground()
方法中设置一个断点,看看它有多远,让我们知道吗?那会有所帮助。
在你的第二个例子中,你说onPostExecute()
在这里失败了:
mProgressDialog.dismiss();
真的只有一种方法可以让它失败。如果mProgressDialog
为空。你能检查一下这个类的构造函数,并确保你记得要实例化它吗?
P.S。您的第一个Context
子类中有第二个通用参数AsyncTask
。但是,你似乎没有使用它。通常情况下,这是doInBackground()
通过onProgressUpdate()
传递给publishProgress()
的数据类型。