1

動作していない2つの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();

この行はスピナーボックスを動的に埋めて機能しなくなるので、コメントアウトしました。

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

この行もスピナーボックスを動的に埋めるので、コメントアウトしました

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

       return null ;
    }

このエリアに到達することはありませんか?

    @ Override
    protected void onPostExecute ( Void result ) {
        if(progressDialog != null && progressDialog.isShowing()){
            progressDialog.dismiss ( ) ;
        }
    }
}

私の2ページ目は、同じスタイルの問題で失敗します。
また、少し異なるコードで設定ページを試してみました。現在修正済み:

//
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()(およびonProgressUpdate())を使用します。

あなたはまだここでUI操作を実行しようとしているように見えます:

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

何をするのかわかりませんInitialiseUI()が、UIっぽく聞こえます。UIの設定が必要な場合はpreExecute()、UIスレッドで呼び出されるで行います。

メソッドにブレークポイントを設定し、doInBackground()それがどこまで進んでいるかを確認して、お知らせください。それは助けになるでしょう。

onPostExecute()2番目の例では、ここで失敗していると言います。

mProgressDialog.dismiss();

それが失敗する唯一の方法が本当にあります。mProgressDialogがnullの場合。このクラスのコンストラクターをチェックして、インスタンス化することを忘れないようにできますか?

PSContext最初のAsyncTaskサブクラスと同様に、2番目の汎用パラメーターがあります。しかし、あなたはそれを使用していないようです。通常、これは経由でdoInBackground()渡されるデータのタイプになります。onProgressUpdate()publishProgress()

于 2012-08-02T01:22:33.737 に答える