2016-01-17 84 views
0

我嘗試編寫一個庫應用程序。我使用php和MySql。onPostExecute永遠不會被調用,但doInBackground返回值

在我的主要活動中,我調用返回3個列表的函數:書籍,購物車和訂單。第一個已滿,但購物車和訂單都是空的。這些函數在myAsyncTask中調用。

new AsyncTask<Void, Void, ArrayList<Book>>() { 
     @Override 
     protected void onPreExecute() { 
     } 

     @Override 
     protected ArrayList<Book> doInBackground(Void... voids) { 
      listBook = backend.getBookInStock(); 
      billForMember = backend.getBillForMember(member.getMemberID()); 
      cart = backend.getCart(member.getMemberID()); 
      return listBook; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Book> list) { 
      searchView = (SearchView) findViewById(R.id.searchView); 
      listView = (ListView) findViewById(R.id.listView); 
      bookAdapter = new BookAdapter(CrownLibrary.this, listBook, AccessType.DIRECTOR, SearchType.BOOK_IN_STOCK, 0); 
      bookAdapter.addListener(CrownLibrary.this); 
      listView.setAdapter(bookAdapter); 
     } 
    }.execute(); 


     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Intent intent = new Intent(CrownLibrary.this, CrownLibraryDetails.class); 
      intent.putExtra(IntentExtra.BOOK.toString(), bookAdapter.getItem(i)); 
      intent.putExtra(IntentExtra.MEMBER.toString(), member); 
      startActivity(intent); 
     } 
    }); 

當我調試我的應用程序時,函數會調用這3個函數,並初始化它們。但是在doInBackground之後,應用程序不會執行onPstExecute。我知道這一點,因爲listView(它在onPostExecute中)永遠不會初始化,並且應用程序停止。

01-17 17:28:25.956 8002-8002/com.example.lilo.ebookstore E/AndroidRuntime:  Caused by: java.lang.NullPointerException 
01-17 17:28:25.956 8002-8002/com.example.lilo.ebookstore E/AndroidRuntime:  at com.example.lilo.ebookstore.CrownLibrary.onCreate(CrownLibrary.java:94) 

我對此沒有任何想法。

+0

可能重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – 0X0nosugar

+0

你可以發佈onCreate()方法代碼嗎?在該方法中有一個例外NPE – Pankaj

回答

0

您需要在AsyncTask之外分配視圖。 onPostExecute在後臺完成後在另一個線程上完成。在此之前,主線程已經到達您分配OnItemClickListener的那一行。只需移動線

searchView = (SearchView) findViewById(R.id.searchView); 
listView = (ListView) findViewById(R.id.listView); 

以外的AsyncTask。

+0

謝謝!有用! – Liloo

相關問題