AsyncTask - 执行doInBackground()时发生错误

问题描述:

我在Android中遇到AsyncTask问题。我尝试从Accelerometr插入数据到数据库,当用户按下开始。通常,当用户按下开始按钮时,应用程序会在5秒钟后挂起。所以我尽量放的AsyncTask这个功能,但我有问题,编译:AsyncTask - 执行doInBackground()时发生错误

01-21 17:44:58.515: E/AndroidRuntime(1131): FATAL EXCEPTION: AsyncTask #1 
01-21 17:44:58.515: E/AndroidRuntime(1131): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.lang.Thread.run(Thread.java:841) 
01-21 17:44:58.515: E/AndroidRuntime(1131): Caused by: java.lang.NullPointerException 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at pl.pawelfrydrych.flyingball.MyTask.insertData(MyTask.java:37) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at pl.pawelfrydrych.flyingball.MyTask.doInBackground(MyTask.java:18) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at pl.pawelfrydrych.flyingball.MyTask.doInBackground(MyTask.java:1) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
01-21 17:44:58.515: E/AndroidRuntime(1131):  ... 4 more 

MyTask类:

import java.util.Date; 

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

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

     private MainActivity main; 
     public Database myDBAdapter; 
     private int abc; 

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

    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, main.xPosition); 
      values.put(Database.RIGHT_POSITION, main.yPosition); 
      values.put(Database.GPS, main.GPSposition); 
      values.put(Database.TIME, date.toString()); 


      if(myDBAdapter.db != null){ 

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

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

     } 

     } 
    } 

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; 

       } 

      } 
+2

显示整个堆栈跟踪到最后。 –

它看起来像你得到一个NPE这里

if(myDBAdapter.db != null){ 

in insertData()因为你永远不会初始化myDBAdapter。你在你的任务中声明它

public Database myDBAdapter; 

但你在尝试使用它之前从不初始化它。

它实际上看起来像你有一个Activity变量和一个AsyncTask变量,所以当你在你的任务中声明它时,它是一个未初始化的局部变量。您可以重新初始化该变量,但如果它们相同,那么删除它并确保它是成员变量(如果任务是内部类Activity)会更好。如果它是一个单独的文件,那么您将需要初始化它或传递对AsyncTask类的构造函数的引用。

+0

是的,我有问题:if(myDBAdapter.db!= null).. 所以,当我尝试 - 数据库myDBAdapter =新的数据库();构造函数应该是主要的? (MainActivity main = new MainActivity())? 嗯,这是工作,但logcat说:数据库为空:)所以这是大成功:D – Algeroth

它看起来不像你正在初始化任何东西private MainActivity main;。您尝试在初始化之前使用它。