0
我是Android開發新手。我在特定場景中遇到了一個問題。 當我打開我的應用程序時,它開始AsyncTask
數據庫查詢。一旦應用程序打開我點擊後退按鈕以終止應用程序,該應用程序與此錯誤崩潰:Android應用程序崩潰doInBackground
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:838)
Caused by: java.lang.NullPointerException
at sarsat.lokate.Activity.MainActivity.Tab1$LongOperation.doInBackground(Tab1.java:62)
at sarsat.lokate.Activity.MainActivity.Tab1$LongOperation.doInBackground(Tab1.java:58)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:838)
這是我的代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
initImageLoader(getApplicationContext());
// Initializing
dataList = new ArrayList<DrawerItem>();
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mDrawerList.setDivider(null);
mDrawerList.setDividerHeight(0);
int width = ((getResources().getDisplayMetrics().widthPixels)) - ((getResources().getDisplayMetrics().widthPixels)/5);
DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerList.getLayoutParams();
params.width = width;
mDrawerList.setLayoutParams(params);
addDrawerItems(dataList);
drawerAdapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
dataList);
mDrawerList.setAdapter(drawerAdapter);
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
//Object o = mDrawerList.getItemAtPosition(position);
//String str=(String)o; //As you are using Default String Adapter
//Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
com.rey.material.widget.CheckBox checkBox = (com.rey.material.widget.CheckBox) v.findViewById(R.id.checkbox);
if(checkBox.isChecked()){
checkBox.setChecked(false);
}
else{
checkBox.setChecked(true);
}
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(
MainActivity.this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getSupportActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
mDrawerToggle.syncState();
}
public void onDrawerOpened(View drawerView) {
getSupportActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
mDrawerToggle.syncState();
}
};
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
mDrawerLayout.setDrawerListener(mDrawerToggle);
// getSupportActionBar().setLogo(R.drawable.ic_drawer);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
// Creating The Toolbar and setting it as the Toolbar for the activity
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
adapter = new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);
// Assigning ViewPager View and setting the adapter
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
// Assiging the Sliding Tab Layout View
tabs = (SlidingTabLayout) findViewById(R.id.tabs);
tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width
// Setting Custom Color for the Scroll bar indicator of the Tab View
tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getResources().getColor(R.color.tabsScrollColor);
}
});
// Setting the ViewPager For the SlidingTabsLayout
tabs.setViewPager(pager);
//seedData();
LongOperation operation = new LongOperation();
operation.execute();
}
而在這個代碼:
LongOperation operation = new LongOperation();
operation.execute();
這就是發生的事情:
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
seedData();
return "Executed";
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {
}
}
如何在AsyncTask
中處理此問題,以便應用程序不再崩潰。
EDITED:
seedData方法:
public void seedData(){
CouchBase db = new CouchBase(getApplicationContext());
db.DeleteAllDocs();
//Add J. Ad
doc = new Doc();
doc.vendorTitle = "Wear J. this summer - upto 50% off";
doc.vendorHandler = "@XYZ";
db.createAd(doc);
}
post'seedData()'方法 –
討厭給調試課,但錯誤消息不是爲了好玩。只要看看這一行:at sarsat.lokate.Activity.MainActivity.Tab1 $ LongOperation.doInBackground(Tab1.java:62) 因此,你的NPE發生在Tab1.java行62 –
是的,我研究了一段時間,但沒有得到我的答案。同樣的AsyncTask正在那裏發生。所以需要處理這種doInBackground錯誤。 –