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 操作..
我的程序崩溃了。
我是 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 操作..
我的程序崩溃了。