1

我有两个不工作的 AsyncTask。我做错了一定有一些共同点。

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

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

在正常的
“public void onCreate(Bundle savedInstanceState)”区域中,下面的这些行可以正常工作

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

        TimeZoneList();

此行动态填充 Spinner 框并使其停止工作,因此我将其注释掉。

    //      createTimezone();
        ZoneList(Ls.getCountryZone());

此行还动态填充微调框,因此我将其注释掉

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

1 回答 1

1

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

在我看来,您仍在尝试在这里执行 UI 操作:

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

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

你能在你的doInBackground()方法中设置一个断点,看看它有多远,然后告诉我们吗?那会有所帮助。

在你的第二个例子中,你说它在onPostExecute()这里失败了:

mProgressDialog.dismiss();

实际上只有一种方法会失败。如果mProgressDialog为空。你能检查这个类的构造函数,并确保你记得实例化它吗?

PS您有第二个通用参数,就像Context在您的第一AsyncTask个子类中一样。但是,您似乎没有使用它。通常,这将是doInBackground()传递给onProgressUpdate()via的数据类型publishProgress()

于 2012-08-02T01:22:33.737 回答