0

アクティビティの onResume() イベントで非同期タスクを実行しようとしています。私の目的は、アクティビティがフォアグラウンドになるたびにタスクを実行することです。エミュレーター/電話で実行すると、onPreExecute メソッドに存在する ProgressDialog コードが検出されると、アプリが強制終了します。

私のアクティビティのコードは次のとおりです。

 public class PostActivity extends Activity {

    private ProgressDialog progressBar;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.post);
    }


    public void onResume() {
        super.onResume();
        new LoadFeedTask().execute();
    }


    public class LoadFeedTask extends AsyncTask<Void, Void, Boolean> {

        protected void onPreExecute() {
            progressBar.setCancelable(false);
            progressBar.setMessage("Logging in...");
            progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressBar.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {

            // TODO Auto-generated method stub
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            Log.d(TAG, "Checking Internet Connectivity");
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {
                return true;
            }
            return false;

        }

        protected void onPostExecute(Boolean result) {

            progressBar.dismiss();

            if (result == true) {

                //Do Something

            }

            if (result == false) {

                //Do Something Else
            }

        }

    }

}

LogCat の出力を確認すると、progressBar.setCancelable(false) に NPE が表示されます。何時間も努力しても解決できません。助けてください。繰り返しの質問である場合はお詫びします。SOで私の問題に関連するそのような質問を見つけることができなかったようです

4

4 に答える 4

3

preExecuteでProgressDialogの4行全体を置き換えてみてください

with progressBar = ProgressDialog.show(PostActivity.this、 ""、 "Logging in ..."、false、false);

于 2012-08-08T19:30:05.013 に答える
0

同じものをどこでも使用したい場合は、クラス内またはクラス内のどこかProgressDialogで却下します。onPostExecuteしたがって、次のように簡単に定義できます progress = new ProgressDialog(RemoteActivity.this);

その場合は機能し、どこでも使用できます。

于 2014-10-28T11:34:03.293 に答える
0

アプリがバックグラウンドに移動すると、アプリがプログレスバーをガベージコレクションしているように聞こえます。asynctask を呼び出す前に、onResume で progressBar 変数を再初期化します。

実際、アプリを最小化すると、progressDialog が閉じられている可能性があります。起動時に実際に開いていることを確認してください。いずれにせよ、progressBar が存在しないため NPE が発生し、それを見つけて元に戻す必要があります。

于 2012-08-08T19:14:42.997 に答える
0

あなたが宣言した

private ProgressDialog progressBar;

しかし、それは初期化されていない (インスタンス化されていない) ため、実際には NULL ポインターです。

onCreate()このコードをメソッドに追加します

progressBar = new ProgressDialog(this, ProgressDialog.STYLE_SPINNER);

あなたの問題を解決します。

于 2012-08-08T19:19:28.623 に答える