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;
}
}
它看起来像你得到一个NPE
这里
if(myDBAdapter.db != null){
in insertData()
因为你永远不会初始化myDBAdapter
。你在你的任务中声明它
public Database myDBAdapter;
但你在尝试使用它之前从不初始化它。
它实际上看起来像你有一个Activity
变量和一个AsyncTask
变量,所以当你在你的任务中声明它时,它是一个未初始化的局部变量。您可以重新初始化该变量,但如果它们相同,那么删除它并确保它是成员变量(如果任务是内部类Activity
)会更好。如果它是一个单独的文件,那么您将需要初始化它或传递对AsyncTask
类的构造函数的引用。
是的,我有问题:if(myDBAdapter.db!= null).. 所以,当我尝试 - 数据库myDBAdapter =新的数据库();构造函数应该是主要的? (MainActivity main = new MainActivity())? 嗯,这是工作,但logcat说:数据库为空:)所以这是大成功:D – Algeroth
它看起来不像你正在初始化任何东西private MainActivity main;
。您尝试在初始化之前使用它。
显示整个堆栈跟踪到最后。 –