2013-08-20 3 views
1

У меня проблема с заполнением ListView с помощью AsyncTask. Обычно он работает нормально, но он очень медленный. Поэтому я внедрил AsyncTask, который должен вернуть значения, а затем адаптер может использовать их для отображения в ListView.Android Sqlite AsyncTask заполняет ListView Null Pointer

Однако, если я запустил это, он возвращает значение nullPointerException для значений.

Оба значения и источник данных являются глобальными переменными, поэтому он должен навредить там. Они работают, когда нити не используются.

Может ли быть, что поток, поскольку он асинхронный, не имеет созданных значений, и поэтому он обращается к nullPointer, когда я должен загружать значения тогда?

 MyAsynch myAs = new MyAsynch(); 
     myAs.execute(); 



     MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values); 

private class MyAsynch extends AsyncTask<Void, Void, Void>{ 
     @Override 
     protected Void doInBackground(Void...strings) { // run time intensive task in separate thread 

      datasource = new ReadingsDataSource(getApplicationContext()); 
      datasource.open(); 
      values = datasource.getAllReadings(); 
      datasource.close(); 
      return null; 
     } 
    }; 

Здесь ошибка:

08-20 12:21:32.107: E/AndroidRuntime(6896): FATAL EXCEPTION: main 
08-20 12:21:32.107: E/AndroidRuntime(6896): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.LoadedApk.makeApplication(LoadedApk.java:482) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3952) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.ActivityThread.access$1300(ActivityThread.java:128) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.os.Looper.loop(Looper.java:137) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.ActivityThread.main(ActivityThread.java:4514) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at dalvik.system.NativeStart.main(Native Method) 
08-20 12:21:32.107: E/AndroidRuntime(6896): Caused by: java.lang.NullPointerException 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:362) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.LoadedApk.getClassLoader(LoadedApk.java:305) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  at android.app.LoadedApk.makeApplication(LoadedApk.java:474) 
08-20 12:21:32.107: E/AndroidRuntime(6896):  ... 11 more 
+0

Вы можете разместить трассировки стека – Raghunandan

+0

Ненавижу отредактированный пост – totpiko

ответ

0

Причина в том, что вы пытаетесь получить доступ к значению, когда его пустым, при использовании AsyncTask код в doInBackground выполняется в фоновом режиме, и вы получаете обратные вызовы. Так что ваш код должен быть, как это

private class MyAsynch extends AsyncTask<Void, Void, Void>{ 

    ProgressDialog pd; 
    @Override 
    protected void onPreExecute() { 
    super.onPreExecute(); 
    pd=ProgressDialog.show(/*you context variable*/,/*Your Title*/,/* Your message while data is loaded*/); 
    } 



      @Override 
      protected Void doInBackground(Void...strings) { // run time intensive task in separate thread 

       datasource = new ReadingsDataSource(getApplicationContext()); 
       datasource.open(); 
       values = datasource.getAllReadings(); 
       datasource.close(); 
       return null; 
      } 
     }; 


    @Override 

    protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    pd.dismiss(); 
    // Give the data to you adapter from here,instead of the place where you gave it earlier 
     MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values); 
    } 
    } 
+0

, а затем назвать его так же, как это было с myAs.execute()? – totpiko

+0

Да, вы правы – Rohit

Смежные вопросы