首页 > 解决方案 > Android 应用程序在 API_Lev 23 中不断崩溃

问题描述

我是安卓开发新手

我在 android 中制作了一个简单的应用程序(对于 api_version 大于 23),它获取所有正在运行的应用程序的名称。但该应用程序无法正常运行。当我单击按钮时,在“onClickListner”中注册的功能不起作用。

package com.sakthi.appban;

    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn = findViewById(R.id.button);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    displayAllApps();
                }
            });
    
        }
    
        private void displayAllApps(){
            PackageManager pm = getPackageManager();
            List<ApplicationInfo> installedApplications = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
            for(ApplicationInfo application : installedApplications){
                Toast.makeText(this, application.name, Toast.LENGTH_SHORT).show();
                try {
                    Thread.sleep(1000);
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            Toast.makeText(this, "Task Ended", Toast.LENGTH_SHORT).show();
        }

希望我能得到帮助

提前致谢

标签: androidandroid-studiocrashandroid-package-managersandroid-developer-api

解决方案


如果您运行此代码,我认为您可能已经在日志中看到这些消息,当您单击按钮时会收到此错误

错误:

java.lang.IllegalStateException:您必须设置文本或视图

对于某些应用程序,此处application.name可能会为空。这可能IllegalStateException是因为您将 null 传递给 Toast。

要解决此问题,只需将 if 条件添加到 null 检查,如下所示:

if(application.name != null) {
   Toast.makeText(this, application.name, Toast.LENGTH_SHORT).show();
 }

然后它应该工作。

更新:

您可以从导致 ANR 的代码中删除此代码:

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

推荐阅读