0

アクティビティにボタンがあります。押すと、別のアクティビティがロードされます。このアクティビティでは、各セルに説明と画像を含むカスタム グリッド ビューがあります。非同期タスクを使用して、リモート サーバーからグリッド ビューにデータを入力しています。

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        if (isInternetAvailable) {
            Intent intent = new Intent(menuActivity.this,
                    gridActivity.class);
            startActivity(intent);
        }
        else {
            MyAlertDialog.ShowAlertDialog(menuActivity.this,
                                          "",
                                          "No network connection",
                                          "OK");
        }
    }
});

ここで testAsyncTask() を共有しています。gridActivity (2 番目のアクティビティ) の onCreate() でこの関数を呼び出しています。

private void testAsyncTask() {
    new AsyncTask<Object, Object, Object>() {

        @Override
        protected void onPreExecute() {

            progress_Dialog = ProgressDialog.show(a, "", "Loading");
        }

        @Override
        protected Integer doInBackground(Object... params) {
            try {
                MenuService menuService = new MenuServiceImpl();
                MenuServiceResponse pMenu = menuService.getMenu();
                itemlist = pMenu.getMenu().getMenus();
                return 0;
            }
            catch (MyServiceException e) {
                MyAlertDialog.ShowAlertDialog(GridActivity.this, "", "No network connection detected.", "OK");
                e.printStackTrace();
            }
            return 0;
        }

        @Override
        protected void onPostExecute(Object result) {

            if (progress_Dialog != null) {
                progress_Dialog.dismiss();
            }

            try
            {
                adapter = new GridAdapter(
                    GridActivity.this, itemlist);
                AllitemgridView.setAdapter(adapter);

            }
            catch(Exception e)
            {
                adapter = null;
                MyAlertDialog.ShowAlertDialog(GridActivity.this, "", "Check Network Connection", "OK");
            }

        }
    }.execute();
}

ボタンを留めた最初のアクティビティで状態を確認しています。インターネットに接続している場合にのみ、開始アクティビティを起動します。

ここで私の問題に入ります。インターネットに接続していてボタンを押すと、startacvitiy が起動し、2 番目のアクティビティに移動します。2 番目のアクティビティの onCreate() で、testAsync() を呼び出しています。読み込みダイアログ ボックスが表示され、バックグラウンドでリモート サーバーからデータをフェッチします。

モデムの電源を切ると、アプリケーションが 5 ~ 6 秒間フリーズし、その後強制終了します。では、この例外をどのように処理できますか?

doInbackgorund() 内のコーディングにはインターネット接続が必要であり、Wi-Fi から切断したときにこのクラッシュが発生する原因である可能性があります。このクラッシュを処理するにはどうすればよいですか?

4

1 に答える 1

1

このメソッドは別のスレッドを実行しているため、doinbackground メソッドでこれを使用することはできません。 MyAlertDialog.ShowAlertDialog(GridActivity.this, "", "No network connection detected.", "OK");

onpost メソッドでのみ使用できます。

または、次のダイアログ メッセージを使用できます。

    @Override
    protected Integer doInBackground(Object... params) {
        try {
            MenuService menuService = new MenuServiceImpl();
            MenuServiceResponse pMenu = menuService.getMenu();
            itemlist = pMenu.getMenu().getMenus();
            return 0;
        } catch (MyServiceException e) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    MyAlertDialog.ShowAlertDialog(GridActivity.this, "", "No network connection detected.", "OK");
                }
            });
            e.printStackTrace();
        }
    }
于 2012-10-11T09:09:58.567 に答える