2014-01-23 98 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将加速位置(从变量),因此我将这些数据插入到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"); 
      } 

     } 

     } 
从MainActivity

OnClick方法:

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说数据库为空

+0

stack trace/show? – Hades

+0

我试图找到信息如何可以得到完整的堆栈跟踪,但我没有任何想法,对不起,我是新手:( – Algeroth

回答

0

MyTask创建一个新的“MainActivity”实例 - 其中“myDBAdapter”未初始化。您需要重新初始化或移动它。

您应该将其移动,因为您可能不希望引用在后台线程上实例化的活动。

+0

移动它在哪里?你的意思是我应该在MyTask类中创建数据库的新实例并在没有MainActivity实例的情况下使用它? – Algeroth

+0

听起来可以接受。AsyncTask被设计用来从UI线程中卸载像数据库访问那样的“数据密集型任务”。将适配器保留在Activity中将它放在UI线程上。在你的活动中执行 – Jim

+0

不幸的是,它没有任何改变。当我删除MainActivity的引用,并使用数据库myDBAdapter = new Database(null); logcat show:db是null也许我应该使用不同的构造函数? – Algeroth

相关问题