Android 尝试从数组列表中设置文本 () 时应用程序崩溃<String>

Android app crashing when trying to setText() from an arraylist<String>

我对 Android Studio 和 Java 有点陌生。我正在尝试通过从 ArrayList 的元素替换它来更新文本。但是,当使用 setText(userList.get(0)) 时,应用程序崩溃了。我的猜测是 arraylist 为空或无法访问。但是我在带有 setOnClickListener 的按钮上使用相同的代码,文本由 arrayList 中找到的字符串更新。

我想让应用自动更新 Text 加载 activity。

这是我的 MainActivity.java -- 我评论了导致应用程序崩溃的 setText。

package com.example.sampletest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    ArrayList<String> userList = new ArrayList<String>();

    TextView text;
    Button swapText;

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

        new getUsers().execute();

        text = (TextView) findViewById(R.id.text);
        swapText = (Button) findViewById(R.id.button);

        //text.setText(userList.get(0));

        swapText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                text.setText(userList.get(0));
            }
        });


    }

    class getUsers extends AsyncTask<Void, Void, Void> {

        String error = "";

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.100.5:3306/cardetailingdb", "lau", "lau");
                Statement statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

                while (resultSet.next()) {
                    userList.add(resultSet.getString(1));
                }
            } catch (Exception e) {
                error = e.toString();
            }
            return null;
        }

    }
}

My guess is that the arraylist is empty or cannot be accessed.

列表为空。您可以在 logcat 中查看堆栈跟踪以获取崩溃详细信息。

But I use the same code on a button with a setOnClickListener, the text is updated by the string found in the arrayList.

那是因为它不是在 onCreate() 中同步执行的,而是稍后在单击按钮时执行的。

I want to make the app automatically update the Text onloading the activity.

您可以将 onPostExecute() 添加到您的异步任务中,一旦后台调用完成,它就会在主线程上获得 运行。您还应该检查异步调用是否确实成功,而不是盲目相信 userList 中有元素。

在异步任务类型中,您应该首先确保填充所有数据。所以请确保背景已完成并且列表不为空。希望一切顺利。对于崩溃问题,您可以添加一个检查点,例如:

if(userList.size()>0){ text.setText(userList.get(0)); }