1

i am coding android app but while using async task it is failing ,i have one async task and error is coming in it's doInBackground() method everything else looks good but doInBackground() method is not working properly . In doInBackground() method i have written the code for fetching the records from database while debugging i found that records are fetched in array-list but they are not geeting fed to
onPostExecute(String result) please help me out ...

private class LoadMoreAsync extends AsyncTask<Context, Void, String> {
    private String strAddress;

    public LoadMoreAsync(Context mContext,String strAddress) {
        /*this.strCardNo = strCardNo;
        this.strFirstName = strFirstName;
        this.strMiddleName = strMiddleName;*/
        this.strAddress = strAddress;
        /*this.strCardNo = strCardNo;*/
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ToastUtils.showToast(mContext, "Loading More...");
    }

    @Override
    protected String doInBackground(Context... arg0) {
        mVoterArray = new ArrayList<AddressInfo>();
        mVoterArray = extDbUtil.getAddresslist(strAddress , limit += 20);
        if (mVoterArray.isEmpty() || mVoterArray == null)
            return null;
        else
            return "";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
         IOUtils.stopLoading();
        if (result == null) {
            ToastUtils.showToast(mContext, "No Record Found!!");
        } else {
            int position = mListView.getLastVisiblePosition();
            mListAdapter = new ListAdapterNew2(mContext,
                    android.R.layout.simple_list_item_1, mVoterArray);
            mListView.setAdapter(mListAdapter);
            mListView.setSelectionFromTop(position, 0);
            mListAdapter.notifyDataSetChanged();
        }
    }
}

code for extDbUtil.getAddresslist(strAddress , limit += 20); method is

public ArrayList<AddressInfo> getAddresslist(String strAddress,int limit) {
    open();
    ArrayList<AddressInfo> mAddressArray = new ArrayList<AddressInfo>();
    String mQuery = "SELECT Address1,TotalMale,TotalFemale,TotalVoters, SrNo  FROM "
            + TABLE_ADDRESS;
    String Where = "";
    if (!strAddress.equals("NA")) {
        Where = " WHERE EAddress1 Like '%" + strAddress + "%'";

    }
    Log.i("SearchQuery", mQuery + Where + " LIMIT " + limit);
    Cursor mCursor = mDatabase.rawQuery(mQuery + Where + " LIMIT " + limit,
            null);

    if (mCursor != null) {
        if (mCursor.moveToFirst()) {                
            do {
                AddressInfo mAddress = new AddressInfo();
                mAddress.setSrNO(mCursor.getString(mCursor
                        .getColumnIndex("SrNo")));
                mAddress.setAddress(mCursor.getString(mCursor
                        .getColumnIndex("Address1")));
                mAddress.setTotalMale(mCursor.getString(mCursor
                        .getColumnIndex("TotalMale")));
                mAddress.setTotalFemal(mCursor.getString(mCursor
                        .getColumnIndex("TotalFemale")));
                mAddress.setTotalVoter(mCursor.getString(mCursor
                        .getColumnIndex("TotalVoters")));                   

            } while (mCursor.moveToNext());
            }


    }
    mCursor.close();
    CleanUp();
    return mAddressArray;
}

coming error is

    01-03 22:59:05.310: D/memalloc(15369): ion: Mapped buffer base:0x51d44000 size:4096 offset:0 fd:87
01-03 22:59:05.310: I/SearchQuery(15369): SELECT Address1,TotalMale,TotalFemale,TotalVoters, SrNo  FROM Addresses WHERE EAddress1 Like '%R%' LIMIT 20
01-03 22:59:05.330: W/dalvikvm(15369): threadid=16: thread exiting with uncaught exception (group=0x41a09600)
01-03 22:59:05.340: D/memalloc(15369): ion: Mapped buffer base:0x555da000 size:196608 offset:0 fd:84
01-03 22:59:05.340: D/memalloc(15369): ion: Mapped buffer base:0x51d4b000 size:4096 offset:0 fd:90
01-03 22:59:05.340: E/AndroidRuntime(15369): FATAL EXCEPTION: AsyncTask #3
01-03 22:59:05.340: E/AndroidRuntime(15369): java.lang.RuntimeException: An error occured while executing doInBackground()
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.lang.Thread.run(Thread.java:864)
01-03 22:59:05.340: E/AndroidRuntime(15369): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.os.Handler.<init>(Handler.java:121)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.widget.Toast$TN.<init>(Toast.java:322)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.widget.Toast.<init>(Toast.java:91)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.widget.Toast.makeText(Toast.java:238)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at com.phoenix.rajtantra.SearchByAdd$List_Async.doInBackground(SearchByAdd.java:284)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at com.phoenix.rajtantra.SearchByAdd$List_Async.doInBackground(SearchByAdd.java:1)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-03 22:59:05.340: E/AndroidRuntime(15369):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-03 22:59:05.340: E/AndroidRuntime(15369):    ... 5 more
01-03 22:59:05.540: D/memalloc(15369): ion: Mapped buffer base:0x5570a000 size:1536000 offset:0 fd:92
01-03 22:59:05.540: D/memalloc(15369): ion: Mapped buffer base:0x53c33000 size:4096 offset:0 fd:94
Vojtěch Pešek
  • 1,070
  • 8
  • 25
inj3ct0r
  • 197
  • 1
  • 3
  • 13

2 Answers2

2

If you read the stack trace, it tells you the root cause:

Caused by: java.lang.RuntimeException: Can't create handler inside thread 
that has not called Looper.prepare()

There is another answer here on SO that covers this question in some detail.

Community
  • 1
  • 1
Todd
  • 30,472
  • 11
  • 81
  • 89
1

The way you are checking, if there is any data is wrong. Rather then using another String, check the ArrayList itself. Make change here

private class LoadMoreAsync extends AsyncTask<Context, Void, Void>

And here:

@Override
protected String doInBackground(Context... arg0) {
    // This just gets data from DB on background Thread
    mVoterArray = new ArrayList<AddressInfo>();
    mVoterArray = extDbUtil.getAddresslist(strAddress , limit += 20);

    return null;
}

@Override
protected void onPostExecute(Void v) {
    super.onPostExecute();

    // If the mVoterArray isnt null and if it isnt empty, then there is some data in there.
    if (mVoterArray != null && !mVoterArray.isEmpty()) {
        int position =  mListView.getLastVisiblePosition();
        mListAdapter = new ListAdapterNew2(mContext,
                android.R.layout.simple_list_item_1, mVoterArray);
        mListView.setAdapter(mListAdapter);
        mListView.setSelectionFromTop(position, 0);
        mListAdapter.notifyDataSetChanged();
    } else {
        ToastUtils.showToast(mContext, "No Record Found!!");
    }
}

EDIT1:

in your getAdressList() method, you are creating an AddressInfo object. But you never add it to your ArrayList. Thats why you get always Toast with no data.

do {
   AddressInfo mAddress = new AddressInfo();
   mAddress.setSrNO(mCursor.getString(mCursor
           .getColumnIndex("SrNo")));
   mAddress.setAddress(mCursor.getString(mCursor
            .getColumnIndex("Address1")));
   mAddress.setTotalMale(mCursor.getString(mCursor
            .getColumnIndex("TotalMale")));
   mAddress.setTotalFemal(mCursor.getString(mCursor
            .getColumnIndex("TotalFemale")));
   mAddress.setTotalVoter(mCursor.getString(mCursor
            .getColumnIndex("TotalVoters")));    

   // Add AddressInfo obejct ot ArrayList!
   mAddressArray.add(mAddress);

} while (mCursor.moveToNext());
Vojtěch Pešek
  • 1,070
  • 8
  • 25