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