#java #android #eclipse #nullpointerexception
#java #Android #затмение #исключение nullpointerexception
Вопрос:
Eclipse, java — я пытаюсь создать setAdapter для создания listview из строки [], которая была сгенерирована в классе AsyncTask для создания sqlconnection. Можете ли вы помочь мне решить эту проблему?
Мой код:
listaMontanha = (ListView) findViewById(R.id.lstmontanharussa);
CriarMontanharussa();
//listaMontanha.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, horariosMontanha));
}
public void CriarMontanharussa(){
LerMontanha montanha = new LerMontanha();
montanha.execute();
}
public class LerMontanha extends AsyncTask<String, Void, String> {
int contador=0;
@Override
protected String doInBackground(String... urls) {
String response = null, codigo = null, hora, estado;
int qt = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("driver conectado");
Connection con = DriverManager.getConnection("jdbc:mysql://10.0.2.2:3306/savetime", "root", "root");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select cd_brinquedo from brinquedo where nm_brinquedo = 'montanha russa'");
if (rs.next()) {
codigo = rs.getString(1);
}
System.out.println("CODIGO= " codigo );
ResultSet rs1 = st.executeQuery("select hh_inicio_rodada from rodada where cd_brinquedo = " codigo);
while(rs1.next()) {
hora = rs1.getString(1);
System.out.println("hora= " hora);
Statement stmt = con.createStatement();
ResultSet rs2 = stmt.executeQuery("select COUNT(*) from solucaoingressorodada where cd_brinquedo = " codigo " and hh_inicio_rodada = '" hora "'");
if (rs2.next()) {
qt = rs2.getInt(1);
}
System.out.println("qt= " qt);
if (qt<10){
estado="Disponível";
} else {
estado ="Fila lotada";
}
horariosMontanha[contador] = hora " " estado;
contador= contador 1;
}
rs1.close();
st.close();
con.close();
}
catch(Exception e) {
e.printStackTrace();
System.out.println("ERRO: " e.toString());
}
return response;
}
@Override
protected void onPostExecute(String resultado) {
for (int i = 0; i < contador; i ){
System.out.println(horariosMontanha[i]);
}
}
}
logcat:
06-22 00:03:06.462: I/System.out(1196): driver conectado
06-22 00:03:07.261: I/System.out(1196): CODIGO= 1
06-22 00:03:07.371: I/System.out(1196): hora= 12:00:00
06-22 00:03:07.381: I/System.out(1196): qt= 1
06-22 00:03:07.391: I/System.out(1196): hora= 12:30:00
06-22 00:03:07.412: I/System.out(1196): qt= 0
06-22 00:03:07.431: I/System.out(1196): 12:00:00 Disponível
06-22 00:03:07.431: I/System.out(1196): 12:30:00 Disponível
06-22 00:03:07.511: D/AndroidRuntime(1196): Shutting down VM
06-22 00:03:07.511: W/dalvikvm(1196): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
06-22 00:03:07.651: E/AndroidRuntime(1196): FATAL EXCEPTION: main
06-22 00:03:07.651: E/AndroidRuntime(1196): java.lang.NullPointerException
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.ListView.onMeasure(ListView.java:1156)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.View.measure(View.java:15172)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.View.measure(View.java:15172)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.View.measure(View.java:15172)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.View.measure(View.java:15172)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-22 00:03:07.651: E/AndroidRuntime(1196): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.View.measure(View.java:15172)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.Choreographer.doCallbacks(Choreographer.java:555)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.Choreographer.doFrame(Choreographer.java:525)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.os.Handler.handleCallback(Handler.java:615)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.os.Handler.dispatchMessage(Handler.java:92)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.os.Looper.loop(Looper.java:137)
06-22 00:03:07.651: E/AndroidRuntime(1196): at android.app.ActivityThread.main(ActivityThread.java:4745)
06-22 00:03:07.651: E/AndroidRuntime(1196): at java.lang.reflect.Method.invokeNative(Native Method)
06-22 00:03:07.651: E/AndroidRuntime(1196): at java.lang.reflect.Method.invoke(Method.java:511)
06-22 00:03:07.651: E/AndroidRuntime(1196): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-22 00:03:07.651: E/AndroidRuntime(1196): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-22 00:03:07.651: E/AndroidRuntime(1196): at dalvik.system.NativeStart.main(Native Method)
Комментарии:
1. Не устанавливайте адаптер, пока не убедитесь, что он находится в допустимом состоянии (и остается в допустимом состоянии). Кажется, вы хотите создать представление для элемента, который имеет значение null.
Ответ №1:
Ваша проблема в том, что вы не принимаете во внимание асинхронный характер AsyncTask
. Вы вызываете свой execute
метод LerMontanha montanha
объекта и сразу устанавливаете адаптер. Исключение NullPointerException возникает из-за того, что вы пытаетесь использовать массив horariosMontanha
, но когда вы пытаетесь его использовать, он все равно ссылается null
. Т.е. у целого фрагмента кода в LerMontanha doInBackground
не было возможности обновить эту переменную.
Кроме того, поскольку вы обновляете horariosMontanha
из двух потоков (потока пользовательского интерфейса и потока, в котором doInBackground
выполняется), вы рискуете столкнуться с множеством проблем.
Эффекты AsyncTask
‘s должны произойти, onPostExecute
и как только массив будет готов, установите адаптер.
Комментарии:
1. О, я понимаю. Так должен ли я выполнять все действия в onPostExecute из AsyncTask, включая setAdapter ? Или как я мог бы сначала выполнить все AsyncTask, а затем setAdapter?
2. Одним из вариантов было бы изменить вашу AsyncTask таким образом, чтобы она возвращала массив из doInBackground (и этот массив передается в onPostExecute) и
onPostExecute
использовать этот массив для настройки адаптера. Необходимо соблюдать осторожность, чтобы при запуске onPostExecute действие все еще находилось в допустимом состоянии (т. Е. Не устанавливайте адаптер, если действие было уничтожено и т.д.)3. Большое вам спасибо, я сделал то, что вы сказали, и работал!