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
-~----------~----~----~----~------~----~------~--~---