2015-06-17 35 views
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); 
} 
+0

post'seedData()'方法 –

+1

討厭給調試課,但錯誤消息不是爲了好玩。只要看看這一行:at sarsat.lokate.Activity.MainActivity.Tab1 $ LongOperation.doInBackground(Tab1.java:62) 因此,你的NPE發生在Tab1.java行62 –

+0

是的,我研究了一段時間,但沒有得到我的答案。同樣的AsyncTask正在那裏發生。所以需要處理這種doInBackground錯誤。 –

回答

0

你將需要當你找出其中你NullPointerException謊言是設計,它打破了當的AsyncTask已被取消的事情。

您的任務調用方法必須保留對它的引用並在調用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; 
}