开发者社区 问答 正文

创建方法错误时,外部无法使用系统服务

我有一个列表,我需要添加到列表视图中,并且从不同的类中获取的数组列表是我的代码:

public class AdminUserDetails extends AppCompatActivity {
    ListView listView;
    List<String>userlist;

    public static  final String TAG="userdetails";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_user_details);
        if (android.os.Build.VERSION.SDK_INT > 9)
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        listView=findViewById(R.id.list_item2);
        String task= "adminuserdetails";
        BackgroundTask backgroundTask= new BackgroundTask(this);

        backgroundTask.execute(task);
//        ArrayAdapter<String> arrayAdapter =  new ArrayAdapter<String>(AdminUserDetails.this,android.R.layout.simple_list_item_1,userlist);
//        listView.setAdapter(arrayAdapter);
//        ArrayList<String> userlist= new ArrayList<String>(backgroundTask1.arraylist);
//        Log.d(TAG,userlist.toString());


    }
    public void getArrayList(List<String> arrayList){
        userlist= arrayList;
        Log.d(TAG,userlist.toString());
        ArrayAdapter<String> arrayAdapter =  new ArrayAdapter<String>(AdminUserDetails.this,android.R.layout.simple_list_item_1,userlist);
        listView.setAdapter(arrayAdapter);

    }

}

我收到此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.a49ersense, PID: 28978
    java.lang.IllegalStateException: System services not available to Activities before onCreate()
        at android.app.Activity.getSystemService(Activity.java:6636)
        at android.view.LayoutInflater.from(LayoutInflater.java:284)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:216)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:210)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:196)
        at com.example.a49ersense.AdminUserDetails.getArrayList(AdminUserDetails.java:45)
        at com.example.a49ersense.BackgroundTask.onPostExecute(BackgroundTask.java:308)
        at com.example.a49ersense.BackgroundTask.onPostExecute(BackgroundTask.java:28)
        at android.os.AsyncTask.finish(AsyncTask.java:755)
        at android.os.AsyncTask.access$900(AsyncTask.java:192)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

我在arrayadapter遇到错误,请帮助我解决这个错误并指出我做错了什么地方。

展开
收起
垚tutu 2019-12-04 17:07:32 657 分享 版权
阿里云 AI 助理回答

错误信息显示为 "java.lang.IllegalStateException: System services not available to Activities before onCreate()",这通常意味着你尝试在 Activity 的正确生命周期之外访问系统服务或资源。在你的代码中,问题出在 getArrayList(List arrayList) 方法里创建 ArrayAdapter 的部分。

错误发生是因为你可能在 BackgroundTaskonPostExecute() 方法中调用了 getArrayList(),此时你直接使用了 Activity 的上下文来实例化 ArrayAdapter,而没有确保这个操作发生在 Activity 生命周期的适当阶段(如 onCreate() 之后)。

要解决这个问题,请确保你只在 Activity 生命周期内安全的时刻调用更新 UI 的方法。你可以通过以下方式修改:

  1. 确认回调时机:确保 BackgroundTask 中的 onPostExecute() 调用 getArrayList() 时,AdminUserDetailsonCreate() 已经完成执行。如果需要,可以在 onPostExecute() 开始时添加日志检查当前状态。

  2. 直接在 onPostExecute() 更新 UI:考虑将更新列表视图的逻辑直接放在 onPostExecute() 内部,而不是通过一个单独的方法。这样可以确保当此代码执行时,Activity 已经完全初始化完毕。

下面是修改后的示例代码,直接在 onPostExecute() 中处理数组列表和设置适配器:

public class AdminUserDetails extends AppCompatActivity {
    ListView listView;
    List<String> userlist; // 假设List的具体类型是String,根据实际情况调整

    public static final String TAG = "userdetails";

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

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        listView = findViewById(R.id.list_item2);
        String task = "adminuserdetails";
        BackgroundTask backgroundTask = new BackgroundTask(this);
        backgroundTask.execute(task);
    }

    class BackgroundTask extends AsyncTask<String, Void, List<String>> { // 假设返回类型是List<String>
        // ... 其他原有代码 ...

        @Override
        protected void onPostExecute(List<String> result) {
            super.onPostExecute(result);
            if (result != null && !result.isEmpty()) {
                userlist = result;
                Log.d(TAG, userlist.toString());
                ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(AdminUserDetails.this, android.R.layout.simple_list_item_1, userlist);
                listView.setAdapter(arrayAdapter);
            }
        }
    }
}

这样修改后,你不再需要 getArrayList() 方法,因为 UI 更新逻辑已经整合到了 onPostExecute() 中,确保了在正确的时机使用了 Activity 上下文。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: