2014-01-23 5 views
0

Я пытаюсь вставить данные в базу данных в потоке, но у меня есть ошибка:NullPointerException при попытке вставить данные в базу данных в теме

01-23 17:17:58.127: E/AndroidRuntime(1400): FATAL EXCEPTION: AsyncTask #1 
01-23 17:17:58.127: E/AndroidRuntime(1400): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at java.lang.Thread.run(Thread.java:841) 
01-23 17:17:58.127: E/AndroidRuntime(1400): Caused by: java.lang.NullPointerException 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at pl.pawelfrydrych.flyingball.MyTask.insertData(MyTask.java:59) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at pl.pawelfrydrych.flyingball.MyTask.doInBackground(MyTask.java:22) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at pl.pawelfrydrych.flyingball.MyTask.doInBackground(MyTask.java:1) 
01-23 17:17:58.127: E/AndroidRuntime(1400):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 

Я хочу, чтобы добавлять позиции ускорения от класса MainActivity (от переменные) через каждые 1 секунду, поэтому я вставляю эти данные в ContentValues, а затем из contentvalues ​​в базу данных.

import java.util.Date; 

import android.content.ContentValues; 
import android.hardware.SensorEvent; 
import android.os.AsyncTask; 
import android.util.Log; 

    public class MyTask extends AsyncTask<Void, Void, Void> { 


     MainActivity main = new MainActivity(); 


     private int abc; 
     float xPositionGlobal, yPositionGlobal; 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      try { 
       insertData(); 
      } catch (InterruptedException e) { 
       Log.d("appname","błąd w doInBackground"); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     public void onSensorChanged(SensorEvent event){ 
      float xPosition = event.values[0]; 
      float yPosition = event.values[1]; 

      xPositionGlobal = xPosition; 
      yPositionGlobal = yPosition; 


     } 


    public void insertData() throws InterruptedException{ 

      ContentValues values = new ContentValues(); 
      Date date = new Date(); 


     while(true){ 
      long millis = System.currentTimeMillis(); 
      abc++; 

      values.put(Database.ID, 1+abc); 
      values.put(Database.LEFT_POSITION, xPositionGlobal); 
      values.put(Database.RIGHT_POSITION, yPositionGlobal); 
     // values.put(Database.GPS, main.GPSposition); 
      values.put(Database.GPS, "3"); 
      values.put(Database.TIME, date.toString()); 


      if(main.myDBAdapter.db != null){ 

       main.myDBAdapter.db.insert("baza", null, values); 
       Thread.sleep(1000 - millis % 1000); 

      }else{ 
       Log.d(Database.DB_NAME,"db is null"); 
      } 

     } 

     } 

OnClick метод от MainActivity:

public void onClick(View v) { 

     switch(v.getId()){ 
     case R.id.bStart: 


     myDBAdapter = new Database(this).open(); 

      new MyTask().execute(); 

     case R.id.bStop: 

      myDBAdapter.close(); 
      break; 

     } 

    } 


} 

При использовании базы данных myDBAdapter = новую базу данных(); , logcat say db is null

+0

stack trace/show? – Hades

+0

Я пытаюсь найти информацию о том, как я могу получить полную трассировку стека, но у меня нет ни малейшего представления, извините, я новичок :( – Algeroth

ответ

0

MyTask создает новый экземпляр «MainActivity» - где «myDBAdapter» не инициализируется. Вам нужно повторно инициализировать его или переместить.

Возможно, вы должны перенести его, потому что вам, вероятно, не нужна ссылка на экземпляр действия в фоновом потоке.

+0

переместить его где? Вы имеете в виду, что я должен создать новый экземпляр базы данных в классе MyTask и использовать его без экземпляра MainActivity? – Algeroth

+0

, который звучит приемлемо. AsyncTask предназначен для разгрузки «задач с интенсивным использованием данных», таких как доступ к базе данных из потока пользовательского интерфейса. Поддержание вашего адаптера в Activity помещает его в поток пользовательского интерфейса. выполните следующие действия: – Jim

+0

К сожалению, ничего не изменилось. Когда я удалил ссылку MainActivity и использовал базу данных myDBAdapter = new Database (null), logcat show: db is null. Может быть, я должен использовать другой конструктор? – Algeroth

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