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

Android AsyncTask onPostExecute 中傳遞 this 導致 ClassCastException 的修正

     編輯:程式設計綜合問答

崩潰堆疊


java.lang.ClassCastException: com.crumbin.tabs.HomeActivity$AsyncLoader cannot be cast to android.app.Activity
    at com.crumbin.utilities.UserFollowingListAdapter.(UserFollowingListAdapter.java:40)
    at com.crumbin.tabs.HomeActivity$AsyncLoader.onPostExecute(HomeActivity.java:106)

Adapter 構造函數期望 Activity 類型 Context,但傳入了 AsyncLoader 實例(this 指向內部類)。

錯誤代碼


protected void onPostExecute(String result) {
    UserFollowingListAdapter csl = new UserFollowingListAdapter(
        HomeActivity.this,           // 正確:外部類 Activity
        R.layout.user_crumbs_list_item,
        users1,
        this); // ❌ 錯誤:this 是 AsyncLoader,非 Activity/Context
    lv.setAdapter(csl);
}

修正:傳遞外部類 Activity 引用


protected void onPostExecute(String result) {
    UserFollowingListAdapter csl = new UserFollowingListAdapter(
        HomeActivity.this,           // 外部 Activity
        R.layout.user_crumbs_list_item,
        users1,
        HomeActivity.this);          // ✅ 修正:傳遞 HomeActivity.this 作為 Context/Listener
    lv.setAdapter(csl);
}

Adapter 構造函數建議簽名


public UserFollowingListAdapter(Context context, int layoutResId,
                                List data, OnItemClickListener listener) {
    this.context = context;
    this.layoutInflater = LayoutInflater.from(context);
    this.data = data;
    this.listener = listener;
}
// Context 用於 inflate、獲取資源
// Listener 定義為接口,Activity 實現

AsyncTask 現代替代方案

AsyncTask 已棄用 (API 30)。推薦:

  • Kotlin Coroutines + Flow/LiveData:結構化並發、生命周期感知。
  • RxJava + AndroidSchedulers.mainThread():函數式鏈式。
  • ExecutorService + runOnUiThread:純 Java 兼容。

Coroutines 遷移示例


lifecycleScope.launch {
    val users = async(Dispatchers.IO) { user.getFollowingCrumbsUpList() }.await()
    withContext(Dispatchers.Main) {
        adapter.submitList(users) // ListAdapter / PagingDataAdapter
    }
}

總結

內部類 this ≠ 外部 Activity。傳遞 Context/Listener 時務必用 OuterClass.this。棄用 AsyncTask,遷移至 Coroutines 等現代異步框架,從根源避免此類上下文混淆錯誤。

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