Reputation: 214
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();
}
Upvotes: 1
Views: 2967
Reputation: 2885
runOnUiThread(new Runnable() {
@Override
public void run() {
// start your asynch task here
}
});
Upvotes: 0
Reputation: 128448
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.
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);
}
Upvotes: 0
Reputation: 1857
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.
}
}
}
}
}
Upvotes: 1