首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

自定義 View 與 Activity 雙向通信:回調接口模式最佳實踐

     編輯:程式設計疑難解答

核心問題

自定義 View 內部發生事件(點擊、滑動、數據變化),需實時通知 Activity 更新業務邏輯或 UI;Activity 也需主動控制 View 行為。

標準解決方案:定義接口回調

1. 在 View 中定義接口


public class CustomView extends View {
    // 定義回調接口
    public interface OnDataChangeListener {
        void onDataChanged(String data, int type);
        void onActionTriggered(String action);
    }

    private OnDataChangeListener listener;

    // 供 Activity 設置監聽器
    public void setOnDataChangeListener(OnDataChangeListener listener) {
        this.listener = listener;
    }

    // 內部事件觸發時調用
    private void notifyDataChanged(String data) {
        if (listener != null) {
            listener.onDataChanged(data, currentType);
        }
    }
}

2. Activity 實現接口並綁定


public class MainActivity extends AppCompatActivity implements CustomView.OnDataChangeListener {
    private CustomView customView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        customView = findViewById(R.id.custom_view);
        customView.setOnDataChangeListener(this); // 綁定
    }

    @Override
    public void onDataChanged(String data, int type) {
        // 處理業務邏輯,更新其他 UI
        textView.setText("收到: " + data);
    }

    @Override
    public void onActionTriggered(String action) {
        if ("refresh".equals(action)) {
            loadDataFromServer();
        }
    }
}

進階模式:雙向綁定與解耦

  • View → Activity:接口回調(如上)。
  • Activity → View:直接調用 View 的 public 方法(customView.refreshData())。
  • 解耦升級:使用 EventBus (Greenrobot/RxBus/LiveData) 實現跨組件通信,避免持有引用導致內存洩漏。

內存洩漏防護


// View 中使用弱引用持有監聽器
private WeakReference<OnDataChangeListener> listenerRef;

public void setOnDataChangeListener(OnDataChangeListener listener) {
    this.listenerRef = new WeakReference<>(listener);
}

private void notifyDataChanged(String data) {
    OnDataChangeListener listener = listenerRef.get();
    if (listener != null) listener.onDataChanged(data, type);
}

或在 Activity onDestroy 中置空:customView.setOnDataChangeListener(null)。

總結

接口回調 是 Android 組件通信的基石,清晰定義契約、職責單一、易測試。配合弱引用或生命周期解綁,構建穩健的自定義 View 生態。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved