Android 应用程序在 API_Lev 23 后继续崩溃

Android App Keep On Crashing In API_Lev 23

我是 android 开发新手

我在 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();
        }

希望能得到帮助

提前致谢

我想你可能已经在日志中看到了这些消息,如果你运行这个代码,当你点击按钮时你会得到这个错误

错误:

java.lang.IllegalStateException: You must either set a text or a view

这里 application.name 可能对某些应用程序无效。这可能会导致 IllegalStateException,因为您将 null 传递给 Toast。

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

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

那么应该可以了。

更新:

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

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

问题是我试图在 UI 线程中循环。 所以 UI 线程无法处理 UI 操作.. 我的程序崩溃了。