Here is the log after I click the cancel button:
DEBUG/dalvikvm(1299): Exception Ljava/lang/RuntimeException; from
Handler.java:94 not caught locally
WARN/dalvikvm(1299): threadid=15: thread exiting with uncaught
exception (group=0x4000fdf8)
ERROR/AndroidRuntime(1299): Uncaught handler: thread Thread-8 exiting
due to uncaught exception
ERROR/AndroidRuntime(1299): java.lang.RuntimeException: Can't create
handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(1299): at
android.os.Handler.<init>(Handler.java:94)
ERROR/AndroidRuntime(1299): at
android.widget.Toast.<init>(Toast.java:348)
ERROR/AndroidRuntime(1299): at
android.widget.Toast.makeText(Toast.java:209)
ERROR/AndroidRuntime(1299): at ciente.cl.AsyncLoadingMgrSample
$LoadingTask2.run(AsyncLoadingMgrSample.java:146)
ERROR/AndroidRuntime(1299): at java.lang.Thread.run(Thread.java:
896)
INFO/Process(508): Sending signal. PID: 1299 SIG: 3
INFO/dalvikvm(1299): threadid=7: reacting to signal 3
INFO/dalvikvm(1299): DALVIK THREADS:
INFO/dalvikvm(1299): "Main" prio=5 tid=3 RUNNABLE
INFO/dalvikvm(1299): | group="main" sCount=1 dsCount=0 s=1
obj=0x40010450
INFO/dalvikvm(1299): | sysTid=496 nice=0 sched=0/0
handle=-1096934148
INFO/dalvikvm(1299): at java.lang.Thread.interrupt(Thread.java:~747)
INFO/dalvikvm(1299): at ciente.cl.AsyncLoadingMgrSample
$1$1.onCancel(AsyncLoadingMgrSample.java:72)
INFO/dalvikvm(1299): at android.app.Dialog
$1.handleMessage(Dialog.java:508)
INFO/dalvikvm(1299): at
android.os.Handler.dispatchMessage(Handler.java:80)
INFO/dalvikvm(1299): at android.os.Looper.loop(Looper.java:91)
INFO/dalvikvm(1299): at
android.app.ActivityThread.main(ActivityThread.java:3052)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): at java.lang.reflect.Method.invokeNative(Native
Method)
INFO/dalvikvm(1299): at java.lang.reflect.Method.invoke(Method.java:
356)
INFO/dalvikvm(1299): at android.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:1547)
INFO/dalvikvm(1299): at android.os.ZygoteInit.main(ZygoteInit.java:
1445)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): at android.dalvik.NativeStart.main(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "Thread-8" prio=5 tid=15 NATIVE
INFO/dalvikvm(1299): | group="main" sCount=1 dsCount=0 s=0
obj=0x40060a90
INFO/dalvikvm(1299): | sysTid=1357 nice=0 sched=0/0 handle=1346432
INFO/dalvikvm(1299): at android.os.BinderProxy.transact(Native
Method)
INFO/dalvikvm(1299): at
android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:
1441)
INFO/dalvikvm(1299): at
android.os.RuntimeInit.crash(RuntimeInit.java:250)
INFO/dalvikvm(1299): at android.os.RuntimeInit
$UncaughtHandler.uncaughtException(RuntimeInit.java:56)
INFO/dalvikvm(1299): at
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:853)
INFO/dalvikvm(1299): at
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:850)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "Binder Thread #2" prio=5 tid=13 NATIVE
INFO/dalvikvm(1299): | group="main" sCount=1 dsCount=0 s=0
obj=0x40021c38
INFO/dalvikvm(1299): | sysTid=1312 nice=-10 sched=0/0 handle=1320328
INFO/dalvikvm(1299): at android.dalvik.NativeStart.run(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "Binder Thread #1" prio=5 tid=11 NATIVE
INFO/dalvikvm(1299): | group="main" sCount=1 dsCount=0 s=0
obj=0x40020438
INFO/dalvikvm(1299): | sysTid=1311 nice=-15 sched=0/0 handle=1317024
INFO/dalvikvm(1299): at android.dalvik.NativeStart.run(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "JDWP" daemon prio=5 tid=9 VMWAIT
INFO/dalvikvm(1299): | group="system" sCount=1 dsCount=0 s=0
obj=0x400b4530
INFO/dalvikvm(1299): | sysTid=1302 nice=0 sched=0/0 handle=1313496
INFO/dalvikvm(1299): at android.dalvik.NativeStart.run(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "Signal Catcher" daemon prio=5 tid=7 RUNNABLE
INFO/dalvikvm(1299): | group="system" sCount=0 dsCount=0 s=0
obj=0x400b1e90
INFO/dalvikvm(1299): | sysTid=1301 nice=0 sched=0/0 handle=1302384
INFO/dalvikvm(1299): at android.dalvik.NativeStart.run(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/dalvikvm(1299): "HeapWorker" daemon prio=5 tid=5 VMWAIT
INFO/dalvikvm(1299): | group="system" sCount=1 dsCount=0 s=0
obj=0x400b0670
INFO/dalvikvm(1299): | sysTid=1300 nice=0 sched=0/0 handle=1299784
INFO/dalvikvm(1299): at android.dalvik.NativeStart.run(Native
Method)
INFO/dalvikvm(1299): (break frame)
INFO/CancelLoadingTask:Run(1299): loading task interruptted
VERBOSE/Toast(1299): SHOW: [EMAIL PROTECTED]
VERBOSE/Toast(1299): HANDLE SHOW: [EMAIL PROTECTED]
showing=false
VERBOSE/Toast(1299): ADD! [EMAIL PROTECTED] in
[EMAIL PROTECTED]
VERBOSE/Toast(1299): HIDE: [EMAIL PROTECTED]
VERBOSE/Toast(1299): HANDLE HIDE: [EMAIL PROTECTED]
showing=true
VERBOSE/Toast(1299): REMOVE! [EMAIL PROTECTED] in
[EMAIL PROTECTED]
On Apr 1, 3:02 pm, "Dan U." <[EMAIL PROTECTED]> wrote:
> Do you have a line number for this exception (Should be in logcat).
> I'd guess maybe it's the Toast show() call needing to be executed in a
> handler.
>
> On Mar 31, 11:15 pm, Rader <[EMAIL PROTECTED]> wrote:
>
> > What i want to do is starting a new thread when i click a button and
> > this new thread will do some long-time tasks. A loading dialog will be
> > shown before that thread starts and will be hidden when the thread
> > ends.If i wait until the thread finishes its job and ends normally,
> > everything will be OK. But if i cancel the loading dialog and
> > "interrupt" the thread in the cancel event handler of that dialog, an
> > UnCaughtExcetpion will be thrown.
>
> > Quote:
> > Can't create handler inside the thread that has not called
> > Looper.prepare()
>
> > Full code: AsyncLoadingMgrSample .java
>
> > Java:
>
> > package ciente.cl;
>
> > import java.util.concurrent.Callable;
> > import java.util.concurrent.CompletionService;
> > import java.util.concurrent.Executor;
> > import java.util.concurrent.ExecutorCompletionService;
> > import java.util.concurrent.FutureTask;
>
> > import android.app.Activity;
> > import android.app.ProgressDialog;
> > import android.content.DialogInterface;
> > import android.content.DialogInterface.OnCancelListener;
> > import android.os.Bundle;
> > import android.os.Handler;
> > import android.util.Log;
> > import android.view.View;
> > import android.view.View.OnClickListener;
> > import android.widget.Button;
> > import android.widget.EditText;
> > import android.widget.Toast;
>
> > /**
> > * @author rader
> > *
> > */
> > public class AsyncLoadingMgrSample extends Activity {
>
> > private final AsyncLoadingMgr mgr=new AsyncLoadingMgr(this);
> > protected Runnable cancelLoding;
> > protected FutureTask<?> loading;;
> > ProgressDialog mProgDlg;
>
> > final public FinishlLoadingTask finishLoadingTask=new
> > FinishlLoadingTask();
>
> > /** Called when the activity is first created. */
> > @Override
> > public void onCreate(Bundle icicle) {
> > super.onCreate(icicle);
> > setContentView(R.layout.asyncloadingmgrsample);
>
> > // loading=new FutureTask<String>(new LoadingTask(this));
> > // cancelLoding=new CancelLoadingTask();
>
> > final Handler handler=new Handler();
>
> > Button btnAsyncLoad=(Button)findViewById(R.id.btnAsyncLoad);
> > btnAsyncLoad.setOnClickListener(new OnClickListener(){
>
> > @Override
> > public void onClick(View arg0){
> > EditText
> > txt=(EditText)findViewById(R.id.txtAsyncLoad);
>
> > // Executor
> > executor=java.util.concurrent.Executors.newFixedThreadPool(1);
> > // CompletionService<String> completionService =
> > // new
> > ExecutorCompletionService<String>(executor);
> > txt.setText("start task...");
> > try {
> > // Callable task=new LoadingTask(handler);
> > final Thread loadingThread=new Thread(new
> > LoadingTask2(handler));
> > loadingThread.start();
>
> > mProgDlg =
> > ProgressDialog.show(AsyncLoadingMgrSample.this, null,
> > "Please wait while loading...",
> > true, true);
> > mProgDlg.setCancelListener(new
> > OnCancelListener(){
>
> > @Override
> > public void onCancel(DialogInterface
> > arg0) {
> > loadingThread.interrupt();
>
> > // while(!
> > loadingThread.isInterrupted()){
> > //
> > // }
>
> > Toast.makeText(AsyncLoadingMgrSample.this,"loading task
> > interruptted",Toast.LENGTH_LONG).show();
>
> > Log.i("CancelLoadingTask:Run","loading task interruptted");
> > EditText
> > txt=(EditText)findViewById(R.id.txtAsyncLoad);
> > txt.setText("loading task
> > interruptted");
>
> > }
>
> > });
> > // completionService.submit(task);
> > txt.setText("wait for the task ending....");
> > } catch (Exception e) {
> > // TODO Auto-generated catch block
> > e.printStackTrace();
> > Log.e("CancelLoadingTask:Run","loading task
> > canceled["+e.toString());
> > }
>
> > }
>
> > });
> > }
>
> > class CancelLoadingTask implements Runnable{
>
> > @Override
> > public void run() {
> > if(mProgDlg!=null)
> > mProgDlg.dismiss();
> > EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
> > txt.setText("loading task canceled");
> > Toast.makeText(AsyncLoadingMgrSample.this,"loading task
> > canceled",Toast.LENGTH_LONG).show();
> > Log.i("CancelLoadingTask:Run","loading task canceled");
>
> > }
>
> > }
> > class FinishlLoadingTask implements Runnable{
>
> > @Override
> > public void run() {
> > if(mProgDlg!=null)
> > mProgDlg.dismiss();
> > EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
> > txt.setText("loading task finshed");
> > Toast.makeText(AsyncLoadingMgrSample.this,"loading task
> > finshed",Toast.LENGTH_LONG).show();
> > Log.i("FinishlLoadingTask:Run","loading task finshed");
>
> > }
>
> > }
> > class LoadingTask2 implements Runnable{
> > private Handler localHandler;
> > private Handler remoteHandler;
> > public LoadingTask2(Handler remotehandler){
> > this.remoteHandler=remotehandler;
> > localHandler=new Handler();
> > }
> > public Handler getLocalHandler(){
> > return localHandler;
> > }
> > @Override
> > public void run() {
> > try {
> > Thread.sleep(10000);
> > // if(Thread.interrupted())
> > // remoteHandler.post(new CancelLoadingTask());
> > // else
> > // remoteHandler.post(new FinishlLoadingTask());
>
> > remoteHandler.post(AsyncLoadingMgrSample.this.finishLoadingTask);
> > } catch (InterruptedException e) {
> > Toast.makeText(AsyncLoadingMgrSample.this,"loading
> > task error",Toast.LENGTH_LONG).show();
> > Log.i("LoadingTask2:Run","loading task error");
> > }
>
> > }
>
> > }
>
> > [quote]
>
> > "remoteHandler" in class LoadingTask2 means a Handler in UI thread.
>
> >
Thanks for help in advance!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[EMAIL PROTECTED]
Announcing the new M5 SDK!
http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---