Использование обратных вызовов в Activity - PullRequest
0 голосов
/ 02 апреля 2011

У нас есть класс Webservice, который принимает WebserviceListener в качестве обратного вызова для этого конкретного вызова webservice.Моя проблема в том, что Android может воссоздать мою активность (изменение ориентации и т. Д.), А затем у меня есть старые ссылки в этом обратном вызове.Когда я пытаюсь установить видимость представления или установить свой скрытый флаг на метод vai saveInstanceState, они все воссоздаются.Как мне решить эту проблему?

У меня есть код:

public class UploadActivity extends Activity implements {


private Button                  mButton;
private volatile boolean        mHidden;


private class UploadWSListener extends WebServiceAdapter {

    @Override
    public void onComplete(Bundle bundle) {
     mSuggestion = (Suggestion) bundle.getSerializable(WebService.BUNDLE_DATA);
        if (mSuggestion.isAutomatic()) {
            myHandler.sendEmptyMessage(1);
        }
        else {
            myHandler.sendEmptyMessage(0);
        }
    }


    @Override
    public void onServerError(ErrorResult error, Bundle bundle) {
        onError(error.getDebugInfo());
    }


    @Override
    public void onError(WebServiceException wse, Bundle bundle) {
        onError(wse.getMessage());
    }


    private void onError(String message) {
        Log.w(TAG, "Error downloading suggestions. Error: " + message);
        myHandler.sendEmptyMessage(-1);
    }

}

private class PhotoUploadHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        Log.d(TAG, "Handler is ivoked. What: " + msg.what);
        switch (msg.what) {
            case 0:
                mButton.setText("Upload");
                break;
            case 1:
                mButton.setVisibility(View.GONE);
                mHidden = true;
                break;
            case -1:
                Toast.makeText(PhotoUploadActivity.this, "Network  error", Toast.LENGTH_LONG).show();
                finish();
                break;
        }
        Log.i(TAG, "Handler with " + msg.what + " run.");

    }
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    Log.i(TAG, "onSaveInstanceState hidden:" + mHidden);
    super.onSaveInstanceState(outState);
    // outState.putBoolean("hide", mButton.getVisibility() == View.GONE);
    outState.putBoolean("hide", mHidden);
}


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState != null && savedInstanceState.getBoolean("hide")) {
        mButton.setVisibility(View.GONE);
    }
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myHandler = new UploadHandler();
    Model model = Model.instance(getApplicationContext());
    WebService service = model.getWebService();

    if (Model.u) {
        Model.u = false;
        service.getSuggestions(new UploadWSListener(), Prefs.getUserToken(getApplicationContext()), getLatitude(),getLongitude(), getAltitude());
    }
}
}

Мои основные вопросы:

  • Как я могу использовать этот дизайн обратного вызова с Activity?(Я в значительной степени зациклен на дизайне)
  • Разумно ли даже сохранять представления в качестве переменных экземпляра в моей деятельности, если они создаются непредсказуемо, или просто получать их через findViewByID?

1 Ответ

0 голосов
/ 02 апреля 2011

Я думаю, что вам нужен способ, чтобы зарегистрировать свою активность и от слушателя, делая это, вы можете реагировать на изменения ориентации, отменяя регистрацию действия и регистрируя его снова при создании нового действия.Насколько я знаю, между разрушением и воссозданием все призывы к «старой» деятельности будут сохраняться до тех пор, пока не будет создана новая деятельность.

Удержание представлений в вашей активности в порядке, так как они будут освобождены / уничтожены, когда ваша деятельность будет разрушена.Если вам нужно обращаться к ним несколько раз, можно держать их как члена класса, так как получение их с помощью findViewByID () может быть дорогостоящим, если ваш макет очень глубоко структурирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...