Android 在活动中使用回调

Android 在活动中使用回调,android,web-services,android-activity,callback,Android,Web Services,Android Activity,Callback,我们有一个Webservice类,它将WebserviceListener作为特定Webservice调用的回调。我的问题是Android可以重新创建我的活动(方向改变等),然后我在回调中有了旧的引用。当我尝试设置视图的可见性,或将隐藏标志设置为vaisaveInstanceStatemethod时,它们都会重新创建。我应该如何解决这个问题 我的守则如下: public class UploadActivity extends Activity implements { private Bu

我们有一个Webservice类,它将WebserviceListener作为特定Webservice调用的回调。我的问题是Android可以重新创建我的活动(方向改变等),然后我在回调中有了旧的引用。当我尝试设置视图的可见性,或将隐藏标志设置为vai
saveInstanceState
method时,它们都会重新创建。我应该如何解决这个问题

我的守则如下:

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());
    }
}
}
我的主要问题是:

  • 如何将此回调设计用于活动?(我对设计非常着迷)
  • 如果视图是不可预测地重新创建的,那么在我的活动中将视图作为实例变量保存,或者仅仅通过
    findViewByID
    获取视图,这是否明智

我认为您需要一种方法来向听众注册活动,并从听众那里注册活动。这样,您可以通过取消注册活动并在创建新活动时再次注册来对方向更改做出反应。据我所知,在破坏和娱乐之间,所有对“旧”活动的调用都将保留,直到创建新活动为止


在活动中保留视图是可以的,因为当活动被销毁时,视图将被释放/销毁。如果您必须多次访问它们,则可以将它们作为类成员保留,因为当布局非常深入时,通过findViewByID()获取它们可能会非常昂贵

我自己解决了这个问题,但我也没有找到更好的解决办法,所以答案是完全可以接受的。谢谢你的回复。