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

Android Bmob SDK:setOnClickListener 中 save() 參數錯誤解決方案

     編輯:程式設計綜合問答

錯誤現象

在 Button 的 OnClickListener 中呼叫 p2.save(this, new SaveListener()) 時,編譯錯誤:

The method save(Context, SaveListener) in the type BmobObject 
is not applicable for the arguments 
(new View.OnClickListener(){}, new SaveListener(){})

錯誤原因

匿名內部類 new OnClickListener() 的 this 指向該 Listener 實例(型別 View.OnClickListener),而非 Activity(Context 子型別)。BmobObject.save() 第一個參數要求 Context。

修正代碼

Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final Person p2 = new Person();
        p2.setName("lucky");
        p2.setAddress("北京海澱");
        
        // 關鍵修正:使用 HelloWorldActivity.this 或 getApplicationContext()
        p2.save(HelloWorldActivity.this, new SaveListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(HelloWorldActivity.this, 
                    "添加資料成功,objectId:" + p2.getObjectId(), 
                    Toast.LENGTH_LONG).show();
            }
            @Override
            public void onFailure(int code, String msg) {
                Toast.makeText(HelloWorldActivity.this, 
                    "建立資料失敗:" + msg, Toast.LENGTH_LONG).show();
            }
        });
    }
});

四種正確取得 Context 的方式

場合寫法說明
Activity 內部類OuterActivity.this明確指向外層 Activity 實例
全域可用getApplicationContext()Application 生命週期最長,避免記憶體洩漏
View 持有view.getContext()任何 View 皆可取得其附屬 Context
Fragment 中requireContext()API 23+,非 null 保證

最佳實務建議

  1. 網路操作放背景執行緒:Bmob SDK 內部可能已處理,但大量資料建議用 RxJava/Coroutines
  2. 避免記憶體洩漏:長生命週期物件持有 Activity Context 時用 WeakReference 或 Application Context
  3. 統一錯誤處理:封裝 BaseCallback 處理共同 Toast/Log/Loading 邏輯

總結

匿名內部類的 this 指向該類別實例,非外層 Activity。在需要 Context 的 API(如 Bmob save、Toast、Dialog、Intent)中,務必使用 ActivityName.this、getApplicationContext() 或 view.getContext() 明確傳遞正確 Context。

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