You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中SplashActivity未运行致列表为空的问题求助

问题解决:SplashActivity未启动及试题列表为空

核心原因

你的SplashActivity从未运行,是因为AndroidManifest.xml中把MainActivity设置为了应用的启动入口(LAUNCHER),App启动后直接进入MainActivity,完全没有走到SplashActivity的初始化逻辑,导致静态列表listS始终为空。


分步解决方案

1. 修改AndroidManifest,设置SplashActivity为启动页

将SplashActivity的intent-filter改为启动入口,同时调整其他Activity的配置,避免多余的intent-filter导致冲突:

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@drawable/mainscreenlogo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/Theme.QuizTheoryApplication"
    tools:targetApi="31">

    <!-- 设为启动页 -->
    <activity
        android:name=".example.QuizTheoryApplication.SplashActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <!-- 移除MainActivity的LAUNCHER配置 -->
    <activity
        android:name=".example.QuizTheoryApplication.MainActivity"
        android:exported="true">
    </activity>

    <activity
        android:name=".example.QuizTheoryApplication.DashboardActivity"
        android:label="Preferences"
        android:exported="true">
    </activity>

</application>

2. 用Intent传递试题列表(替代静态变量,避免内存泄漏)

静态变量传递数据容易引发内存泄漏问题,推荐通过Parcelable接口实现数据的安全传递:

第一步:让ModelClass实现Parcelable接口

public class ModelClass implements Parcelable {
    private String question;
    private String optionA;
    private String optionB;
    private String optionC;
    private String optionD;
    private String answer;

    // 构造方法
    public ModelClass(String question, String optionA, String optionB, String optionC, String optionD, String answer) {
        this.question = question;
        this.optionA = optionA;
        this.optionB = optionB;
        this.optionC = optionC;
        this.optionD = optionD;
        this.answer = answer;
    }

    // Parcelable核心方法
    protected ModelClass(Parcel in) {
        question = in.readString();
        optionA = in.readString();
        optionB = in.readString();
        optionC = in.readString();
        optionD = in.readString();
        answer = in.readString();
    }

    public static final Creator<ModelClass> CREATOR = new Creator<ModelClass>() {
        @Override
        public ModelClass createFromParcel(Parcel in) {
            return new ModelClass(in);
        }

        @Override
        public ModelClass[] newArray(int size) {
            return new ModelClass[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(question);
        dest.writeString(optionA);
        dest.writeString(optionB);
        dest.writeString(optionC);
        dest.writeString(optionD);
        dest.writeString(answer);
    }

    // Getter方法(按需添加)
    public String getQuestion() { return question; }
    public String getAnswer() { return answer; }
    // 其他选项的Getter...
}

第二步:修改SplashActivity的跳转逻辑

移除静态变量,通过Intent传递列表:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity_main);

        ArrayList<ModelClass> listS = new ArrayList<>();
        listS.add(new ModelClass("here is the question", "a", "b", "c", "d", "answer"));
        listS.add(new ModelClass("Under-inflated tires increase fuel consumption. A single tire under-inflated by 56 kpa (8 psi) can increase fuel consumption by?", "25 per cent", "15 per cent", "Seven per cent", "Four per cent", "Four per cent"));
        listS.add(new ModelClass("You are not allowed to park a vehicle within _____________ of a pedestrian corridor", "9 metres", "3 metres", "30 metres", "15 metres", "15 metres"));
        listS.add(new ModelClass("What class licence permits the holder to operate a motorcycle?", "Class 4", "Class 1", "Class 6", "Class 5", "Class 6"));
        listS.add(new ModelClass("Seatbelts must be worn by all drivers and passengers:", "Only when driving in the city", "Only when carrying passengers", "All the time unless exempted by law", "Only when driving on the highway", "All the time unless exempted by law"));

        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this, DashboardActivity.class);
                // 传递试题列表
                intent.putParcelableArrayListExtra("QUESTIONS_LIST", listS);
                startActivity(intent);
                // 关闭Splash,避免返回时回到启动页
                finish();
            }
        }, 1500);
    }
}

第三步:在DashboardActivity中接收数据

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);

        Hooks();
        // 从Intent中获取试题列表
        ArrayList<ModelClass> allQuestionsList = getIntent().getParcelableArrayListExtra("QUESTIONS_LIST");
        
        // 处理空列表的异常情况
        if (allQuestionsList == null || allQuestionsList.isEmpty()) {
            Toast.makeText(this, "试题数据加载失败", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        
        Collections.shuffle(allQuestionsList);
        modelClass = allQuestionsList.get(index);

        setAllData();
}

为什么之前的尝试无效

  • 你在DashboardActivity中跳转SplashActivity的逻辑是错误的:Dashboard已经先启动并执行了初始化代码,此时再跳Splash,Dashboard中的listS已经是空值,而且会导致Activity栈混乱。
  • 静态变量传递数据本身不是可靠方案,一旦App进程被回收,静态变量会被清空,且容易引发内存泄漏。

内容的提问来源于stack exchange,提问作者ISTech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:05:37