Android应用程序在错误doInBackground时崩溃

时间:2015-06-17 19:44:12

标签: java android android-asynctask

我是Android开发的新手。我在特定情况下遇到了一个问题。 当我打开我的应用程序时,它会启动AsyncTask进行数据库查询。一旦应用程序打开,我点击后退按钮终止应用程序,应用程序崩溃时出现此错误:

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);
}

1 个答案:

答案 0 :(得分:0)

当您确定NullPointerException所在的位置时,您需要做的是将其设计为在AsyncTask被取消时突破。

此任务的调用方法必须在onPause调用asyncTask.cancel()内保留对其的引用。

您必须在AsyncTask中正确处理中断,并在继续执行操作之前检查任务是否已被取消。

protected Object doInBackground(Ojbect... objs) {
     //...
     while (completingYourTask) {
         // Do your task but check before your NPException when needed
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return null;
 }