2014-06-22 4 views
0

이클립스, 자바 - 나는 문자열을 [] AsyncTask 클래스에서 sqlconnection을 생성하기 위해 생성 된 listview를 만들 수있는 setAdapter 노력하고있어. 이 문제를 해결하도록 도와 주시겠습니까?setAdapter from String [] - nullpointerexception

내 코드 :

 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]); 
     } 
    } 
} 

로그 캣 :

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

유효 상태에 있고 (유효한 상태로 유지되기 전에) 어댑터를 설정하지 마십시오. 널 (null) 인 항목에 대한보기를 작성하려는 것 같습니다. – fabian

답변

0

귀하의 문제는 당신이 계정에 AsyncTask의 비동기 특성을 고려하지 않는다는 것입니다. LerMontanha montanha 개체의 execute 메서드를 호출하고 즉시 어댑터를 설정합니다. horariosMontanha 배열을 사용하려고하기 때문에 NullPointerException이 발생하지만 사용하려고 할 때 여전히 null을 참조합니다. 나는. LerMontanha의 doInBackground에있는 전체 코드 조각은 해당 변수를 업데이트 할 기회가 없었습니다.

또한 horariosMontanha을 두 개의 스레드 (UI 스레드와 스레드 doInBackground이 실행되는 스레드)에서 업데이트하므로 많은 문제가 발생할 위험이 있습니다.

AsyncTask의 효과는 onPostExecute에 발생해야하며 일단 어레이가 준비되면 어댑터를 설정하십시오.

+0

아, 알겠습니다. 그렇다면 setAdapter를 포함하여 AsyncTask의 onPostExecute에서 모든 작업을 수행해야합니까? 또는 어떻게 모든 AsyncTask를 먼저 실행하고 setAdapter를 나중에 실행할 수 있습니까? –

+0

하나의 옵션은 AsyncTask를 수정하여 doInBackground에서 배열을 반환하고 (이 배열은 onPostExecute로 전달됩니다),'onPostExecute'에서이 배열을 사용하여 어댑터를 구성합니다. onPostExecute가 실행될 때 활동이 여전히 유효한 상태 (즉, 활동이 파괴 된 경우 어댑터를 설정하지 않음)에 유의해야합니다. – frozenkoi

+0

대단히 감사합니다. –