1

I have a class in which a button is pressed it shows a dialog box. This box has two buttons YES,NO. When i click YES i want to call async task to update some values in DB. I tried this but it Gives me Looper.prepare() error. Searched all over SO and GOogle but no solution. Does any1 have any ideas?

Thanx

bttnSync.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            if (isOnline()) {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        MainPage.this);
                alertDialogBuilder.setTitle("Syncing all data....!!");
                alertDialogBuilder
                        .setMessage(
                                "Are you sure you want to Sync all the data?")
                        .setCancelable(false)
                        .setPositiveButton("Yes",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(
                                            DialogInterface dialog, int id) {

                                         //call();

                                        new CountDownTask().execute();

                                        MainPage.this.finish();
                                        Intent i = new Intent(
                                                "com.example.collegesoft.MainPage");
                                        startActivity(i);
                                    }
                                })
                        .setNegativeButton("No",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(
                                            DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });

                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();
            } else {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        MainPage.this);
                alertDialogBuilder.setTitle("No Internet Connection!!");
                alertDialogBuilder
                        .setMessage(
                                "Device is not connected to the Internet or the connection is slow.")
                        .setCancelable(false)

                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(
                                            DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });

                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();
            }

        }
    });


private class CountDownTask extends AsyncTask<Void, Integer, Void> {

    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(MainPage.this, "Loading...",
                "Loading application , please wait...", false, false);

    }

    protected Void doInBackground(Void... params) {
        call();


        return null;
    }

    protected void onProgressUpdate(Integer... values) {
        progressDialog.setProgress(values[0]);
    }

    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
    }

}


   01-31 10:41:37.575: E/AndroidRuntime(9038): FATAL EXCEPTION: AsyncTask #1
   01-31 10:41:37.575: E/AndroidRuntime(9038): java.lang.RuntimeException: An error   occured while executing doInBackground()
   01-31 10:41:37.575: E/AndroidRuntime(9038):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
      01-31 10:41:37.575: E/AndroidRuntime(9038):   at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    01-31 10:41:37.575: E/AndroidRuntime(9038):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
       01-31 10:41:37.575: E/AndroidRuntime(9038):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at java.lang.Thread.run(Thread.java:856)
    01-31 10:41:37.575: E/AndroidRuntime(9038): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at android.os.Handler.<init>(Handler.java:121)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at android.app.Activity.<init>(Activity.java:735)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at com.example.collegesoft.SyncData.<init>(SyncData.java:22)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at com.example.collegesoft.MainPage.call(MainPage.java:259)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at com.example.collegesoft.MainPage$CountDownTask.doInBackground(MainPage.java:284)
     01-31 10:41:37.575: E/AndroidRuntime(9038):    at com.example.collegesoft.MainPage$CountDownTask.doInBackground(MainPage.java:1)
       01-31 10:41:37.575: E/AndroidRuntime(9038):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
      01-31 10:41:37.575: E/AndroidRuntime(9038):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
   01-31 10:41:37.575: E/AndroidRuntime(9038):  ... 4 more
    01-31 10:41:43.966: E/WindowManager(9038): Activity  com.example.collegesoft.MainPage has leaked window  com.android.internal.policy.impl.PhoneWindow$DecorView@41753818 that was originally added  here
     01-31 10:41:43.966: E/WindowManager(9038): android.view.WindowLeaked: Activity com.example.collegesoft.MainPage has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41753818 that was originally added here
     01-31 10:41:43.966: E/WindowManager(9038):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:383)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
  01-31 10:41:43.966: E/WindowManager(9038):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
     01-31 10:41:43.966: E/WindowManager(9038):     at android.app.Dialog.show(Dialog.java:278)
   01-31 10:41:43.966: E/WindowManager(9038):   at android.app.ProgressDialog.show(ProgressDialog.java:116)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.app.ProgressDialog.show(ProgressDialog.java:104)
     01-31 10:41:43.966: E/WindowManager(9038):     at com.example.collegesoft.MainPage$CountDownTask.onPreExecute(MainPage.java:278)
     01-31 10:41:43.966: E/WindowManager(9038):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.os.AsyncTask.execute(AsyncTask.java:511)
   01-31 10:41:43.966: E/WindowManager(9038):   at com.example.collegesoft.MainPage$3$1$1.run(MainPage.java:82)
       01-31 10:41:43.966: E/WindowManager(9038):   at android.os.Handler.handleCallback(Handler.java:605)
       01-31 10:41:43.966: E/WindowManager(9038):   at android.os.Handler.dispatchMessage(Handler.java:92)
    01-31 10:41:43.966: E/WindowManager(9038):  at android.os.Looper.loop(Looper.java:137)
      01-31 10:41:43.966: E/WindowManager(9038):    at android.app.ActivityThread.main(ActivityThread.java:4514)
   01-31 10:41:43.966: E/WindowManager(9038):   at java.lang.reflect.Method.invokeNative(Native Method)
   01-31 10:41:43.966: E/WindowManager(9038):   at java.lang.reflect.Method.invoke(Method.java:511)
  01-31 10:41:43.966: E/WindowManager(9038):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
   01-31 10:41:43.966: E/WindowManager(9038):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
     01-31 10:41:43.966: E/WindowManager(9038):     at dalvik.system.NativeStart.main(Native Method)

My call() method ....

protected void call() {
    Log.d(TAG,"Call Called");
    myDbHelper = new DatabaseHelper(MainPage.this);

    try {

        myDbHelper.openDataBase();

    } catch (SQLException sqle) {

        throw sqle;

    }

    Cursor c = myDbHelper.getAllStudentFromMainTable();

    Log.d(TAG, "Cursor : " + c.getColumnCount());

    //new CountDownTask().execute();
    new SyncData().sendJson(c, myDbHelper, MainPage.this);

    //c.close();

}
LeXeR
  • 214
  • 3
  • 20

3 Answers3

1

You can create a Handler at your activity and then use it to post what you need to do.

Example:

public void onAvatarChange(View v) {
   final Handler uiHandler = new Handler();

   //Build dialog....
   OnclickListener onYes = new OnClickListener {
       public void onClick(View v) {
            uiHanlder.post(new Runnable() {
                 public void run() {
                     //Do whatever you want here...
                     //You will have looper.prepare here, as it will run on main thread as soon as possible.
                 }
            }
       }
   }

}
Pozzo Apps
  • 1,859
  • 2
  • 22
  • 32
  • Pozzo.... i have updated my code. can u help me now to how exactly i should proceed? – LeXeR Jan 31 '13 at 10:29
  • Well, looking for your code I will sugest you to study about services..... Also "MainPage.this.finish()" and the next lines would go on "onPostExecute()". – Pozzo Apps Jan 31 '13 at 10:34
  • I tried your method.. the loading screen shows up but then the app crashes with this error – LeXeR Jan 31 '13 at 10:43
  • i tried your method but now i get this error in my logcat... i have updated it – LeXeR Jan 31 '13 at 10:45
  • Have you created the Handler in main thread? ... it has to be before "bttnSync.setOnClickListener(new OnClickListener() {" – Pozzo Apps Jan 31 '13 at 10:50
  • Just testes here, and worked... Sorry, but I think I'm missing something, really dont know. – Pozzo Apps Jan 31 '13 at 11:05
  • Well..... the thing is, i have a series of nested calls for local functions and functions from another class to insert into DB and upload JSON... i wanted to do all of this using AyncTask so that it shows a loading screen..... i have tried the solution by @Pozzo, it works for the 1st part but crashes for 2nd..... any idea as to how to do all this with one asynctask call ??? – LeXeR Feb 01 '13 at 05:38
0

Howz this possible?

new CountDownTask().execute();

MainPage.this.finish();
Intent i = new Intent("com.example.collegesoft.MainPage");                                              
startActivity(i);

I mean at one point, you are executing AsyncTask and at the same moment you are starting new activity. so it gives you error just because you have displayed ProgressDialog inside the CountDownTask.

Solution:

Instead, proposed solution is to include startActivity() code inside the onPostExecute() method of CountDownTask():

protected void onPostExecute(Void result) {
  progressDialog.dismiss();

  MainPage.this.finish();
  Intent i = new Intent("com.example.collegesoft.MainPage");                                              
  startActivity(i);

}
Paresh Mayani
  • 127,700
  • 71
  • 241
  • 295
0
runOnUiThread(new Runnable() {
        @Override
        public void run() {

            // start your asynch task here

        }
    });
Anand
  • 2,875
  • 1
  • 18
  • 16
  • From asynctask am actually calling call(), wht i do here is i update the DB and send a json to the server, and i want to show a loading screen till this happens. But nothing is happening. – LeXeR Jan 31 '13 at 10:40
  • hmmm.... so should i do the same thing as pozzo suggested int call() method for Sync also? – LeXeR Jan 31 '13 at 10:53