Eclipse,java - 我尝试使用setAdapter从String []创建一个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)
答案 0 :(得分:0)
您的问题是您没有考虑AsyncTask
的异步性质。您调用execute
对象的LerMontanha montanha
方法并立即设置适配器。 NullPointerException正在发生,因为您尝试使用数组horariosMontanha
,但是当您尝试使用它时,它仍然引用null
。即LerMontanha doInBackground
中的整个代码块都没有机会更新该变量。
此外,由于您从两个线程(UI线程和运行horariosMontanha
的线程)更新doInBackground
,因此存在很多问题。
AsyncTask
的效果应该发生在onPostExecute
中,一旦数组准备就绪,请设置适配器。