2012-08-02 80 views
1

我有两个不起作用的AsyncTask。必须有一些共同点,我做错了。无法停止AsyncTask中的ProgressDialog

我的第一个活动需要很长时间来加载,所以我希望有一个progressDialog/Bar,但它失败。我访问的AsyncTask在我的onCreate与

new 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 

低于做工精细这些线时,在正常
“公共无效的onCreate(捆绑savedInstanceState)”区域

 Ls = new LoadSettings(CreateAppointment.this); 
     gs = new GlobalSubs(); 

     TimeZoneList(); 

此行动态填充一个微调框并阻止它工作,所以我评论了它。

//  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); 
    } 
+1

你能否描述你的问题而不中断发布的代码?你的ASyncTask如何实现几乎是无法理解的。 – WarrenFaith 2012-08-02 01:17:34

回答

1

你是不是应该在背景中对UI做任何事情。 doInBackground()在后台线程上运行。如果您需要在后台进程中更新UI,则可以使用publishProgress()(和onProgressUpdate())。

它看起来对我来说,你仍然想在这里执行的UI操作:

// createZone(); 
    InitialiseUI(); 
    CreateFileName(); 

我不知道是什么InitialiseUI()做,但它听起来UI十岁上下。如果您需要UI设置,请在UI线程中调用preExecute()

你可以在你的doInBackground()方法中设置一个断点,看看它有多远,让我们知道?这将有所帮助。

在你的第二个例子,你说这是失败在这里onPostExecute()

mProgressDialog.dismiss(); 

这确实为失败只有一个办法。如果mProgressDialog为空。你可以检查这个类的构造函数,并确保你记得实例化它吗?

P.S.您的第一个AsyncTask子类中有第二个通用参数Context。但是,你似乎没有使用它。通常,这将是doInBackground()通过publishProgress()传递给onProgressUpdate()的数据类型。

+0

我可以让它“返回null”,然后它永远不会到OnPostExecute。在第二个例子中,它得到OnPostExecute但锁定在mProgressDialog.dissmis();这就是它被注释掉的原因。 – John 2012-08-02 01:26:27

+0

... to * what *?另外,你在看LogCat窗口吗?你看到有什么例外吗?你有'try-catch'块的代码,你在哪里捕获异常,但是什么也不做(空'catch'处理程序)? – Nate 2012-08-02 01:29:14

+0

我将检查InitialiseUI,因为它会更新UI,但似乎没有问题。 – John 2012-08-02 01:29:43