Asynchronously loading problem

Put your problem here if it does not fit any of the other categories.

Asynchronously loading problem

Postby Rader » Tue Apr 01, 2008 4:32 am

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.

Can't create handler inside the thread that has not called Looper.prepare()


Full code: AsyncLoadingMgrSample .java

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package ciente.cl;
  3.  
  4.  
  5.  
  6. import java.util.concurrent.Callable;
  7.  
  8. import java.util.concurrent.CompletionService;
  9.  
  10. import java.util.concurrent.Executor;
  11.  
  12. import java.util.concurrent.ExecutorCompletionService;
  13.  
  14. import java.util.concurrent.FutureTask;
  15.  
  16.  
  17.  
  18. import android.app.Activity;
  19.  
  20. import android.app.ProgressDialog;
  21.  
  22. import android.content.DialogInterface;
  23.  
  24. import android.content.DialogInterface.OnCancelListener;
  25.  
  26. import android.os.Bundle;
  27.  
  28. import android.os.Handler;
  29.  
  30. import android.util.Log;
  31.  
  32. import android.view.View;
  33.  
  34. import android.view.View.OnClickListener;
  35.  
  36. import android.widget.Button;
  37.  
  38. import android.widget.EditText;
  39.  
  40. import android.widget.Toast;
  41.  
  42.  
  43.  
  44. /**
  45.  
  46.  * @author rader
  47.  
  48.  *
  49.  
  50.  */
  51.  
  52. public class AsyncLoadingMgrSample extends Activity {
  53.  
  54.        
  55.  
  56.         private final AsyncLoadingMgr mgr=new AsyncLoadingMgr(this);
  57.  
  58.         protected Runnable cancelLoding;
  59.  
  60.         protected FutureTask<?> loading;;
  61.  
  62.         ProgressDialog mProgDlg;
  63.  
  64.        
  65.  
  66.         final public FinishlLoadingTask finishLoadingTask=new FinishlLoadingTask();
  67.  
  68.        
  69.  
  70.         /** Called when the activity is first created. */
  71.  
  72.         @Override
  73.  
  74.         public void onCreate(Bundle icicle) {
  75.  
  76.                 super.onCreate(icicle);
  77.  
  78.                 setContentView(R.layout.asyncloadingmgrsample);
  79.  
  80.                
  81.  
  82. //              loading=new FutureTask<String>(new LoadingTask(this));
  83.  
  84. //              cancelLoding=new CancelLoadingTask();
  85.  
  86.                
  87.  
  88.                 final Handler handler=new Handler();   
  89.  
  90.                
  91.  
  92.                
  93.  
  94.                 Button btnAsyncLoad=(Button)findViewById(R.id.btnAsyncLoad);
  95.  
  96.                 btnAsyncLoad.setOnClickListener(new OnClickListener(){
  97.  
  98.  
  99.  
  100.                         @Override
  101.  
  102.                         public void onClick(View arg0){
  103.  
  104.                                 EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
  105.  
  106.                        
  107.  
  108.                                 Executor executor=java.util.concurrent.Executors.newFixedThreadPool(1);
  109.  
  110.                                 CompletionService<String> completionService =
  111.  
  112.                                  new ExecutorCompletionService<String>(executor);
  113.  
  114.                                 txt.setText("start task...");
  115.  
  116.                                 try {
  117.  
  118. //                                      Callable task=new LoadingTask(handler);
  119.  
  120.                                         final Thread loadingThread=new Thread(new LoadingTask2(handler));
  121.  
  122.                                         loadingThread.start();
  123.  
  124.                                        
  125.  
  126.                                         mProgDlg = ProgressDialog.show(AsyncLoadingMgrSample.this, null,
  127.  
  128.                                                         "Please wait while loading...", true, true);
  129.  
  130.                                         mProgDlg.setCancelListener(new OnCancelListener(){
  131.  
  132.  
  133.  
  134.                                                 @Override
  135.  
  136.                                                 public void onCancel(DialogInterface arg0) {
  137.  
  138.                                                         loadingThread.interrupt();
  139.  
  140.                                                        
  141.  
  142. //                                                      while(!loadingThread.isInterrupted()){
  143.  
  144. //                                                             
  145.  
  146. //                                                      }
  147.  
  148.                                                         Toast.makeText(AsyncLoadingMgrSample.this,"loading task interruptted",Toast.LENGTH_LONG).show();
  149.  
  150.                                                         Log.i("CancelLoadingTask:Run","loading task interruptted");
  151.  
  152.                                                         EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
  153.  
  154.                                                         txt.setText("loading task interruptted");
  155.  
  156.                                                        
  157.  
  158.                                                 }
  159.  
  160.                                                
  161.  
  162.                                         });
  163.  
  164. //                                      completionService.submit(task);
  165.  
  166.                            txt.setText("wait for the task ending....");
  167.  
  168.                                 } catch (Exception e) {
  169.  
  170.                                         // TODO Auto-generated catch block
  171.  
  172.                                         e.printStackTrace();
  173.  
  174.                                         Log.e("CancelLoadingTask:Run","loading task canceled["+e.toString());
  175.  
  176.                                 }
  177.  
  178.                                  
  179.  
  180.                         }
  181.  
  182.                        
  183.  
  184.                 });
  185.  
  186.         }
  187.  
  188.        
  189.  
  190.         class CancelLoadingTask implements Runnable{
  191.  
  192.  
  193.  
  194.                 @Override
  195.  
  196.                 public void run() {
  197.  
  198.                         if(mProgDlg!=null)
  199.  
  200.                                 mProgDlg.dismiss();
  201.  
  202.                         EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
  203.  
  204.                         txt.setText("loading task canceled");
  205.  
  206.                         Toast.makeText(AsyncLoadingMgrSample.this,"loading task canceled",Toast.LENGTH_LONG).show();
  207.  
  208.                         Log.i("CancelLoadingTask:Run","loading task canceled");
  209.  
  210.                        
  211.  
  212.                 }
  213.  
  214.                
  215.  
  216.         }
  217.  
  218.         class FinishlLoadingTask implements Runnable{
  219.  
  220.  
  221.  
  222.                 @Override
  223.  
  224.                 public void run() {
  225.  
  226.                         if(mProgDlg!=null)
  227.  
  228.                                 mProgDlg.dismiss();
  229.  
  230.                         EditText txt=(EditText)findViewById(R.id.txtAsyncLoad);
  231.  
  232.                         txt.setText("loading task finshed");
  233.  
  234.                         Toast.makeText(AsyncLoadingMgrSample.this,"loading task finshed",Toast.LENGTH_LONG).show();
  235.  
  236.                         Log.i("FinishlLoadingTask:Run","loading task finshed");
  237.  
  238.                        
  239.  
  240.                 }
  241.  
  242.                
  243.  
  244.         }
  245.  
  246.         class LoadingTask2 implements Runnable{
  247.  
  248.                 private Handler localHandler;
  249.  
  250.                 private Handler remoteHandler;
  251.  
  252.                 public LoadingTask2(Handler remotehandler){
  253.  
  254.                         this.remoteHandler=remotehandler;
  255.  
  256.                         localHandler=new Handler();
  257.  
  258.                 }
  259.  
  260.                 public Handler getLocalHandler(){
  261.  
  262.                         return localHandler;
  263.  
  264.                 }
  265.  
  266.                 @Override
  267.  
  268.                 public void run() {                    
  269.  
  270.                         try {
  271.  
  272.                                 Thread.sleep(10000);
  273.  
  274. //                              if(Thread.interrupted())
  275.  
  276. //                                      remoteHandler.post(new CancelLoadingTask());
  277.  
  278. //                              else
  279.  
  280. //                                      remoteHandler.post(new FinishlLoadingTask());
  281.  
  282.                                 remoteHandler.post(AsyncLoadingMgrSample.this.finishLoadingTask);
  283.  
  284.                         } catch (InterruptedException e) {
  285.  
  286.                                 Toast.makeText(AsyncLoadingMgrSample.this,"loading task error",Toast.LENGTH_LONG).show();
  287.  
  288.                                 Log.i("LoadingTask2:Run","loading task error");
  289.  
  290.                         }
  291.  
  292.                        
  293.  
  294.                 }
  295.  
  296.        
  297.  
  298.         }
  299.  
  300.        
  301.  
  302.  
Parsed in 0.050 seconds, using GeSHi 1.0.8.4
[quote]

remoteHandler” in class LoadingTask2 means a Handler in UI thread.

Thanks for help in advance!
Best regards,

Rader
Rader
Freshman
Freshman
 
Posts: 6
Joined: Thu Mar 06, 2008 8:10 am
Location: China

Top

problem solved, toast should be shown in the UI thread

Postby Rader » Wed Apr 02, 2008 3:58 am

I made a Toast notification after I caught the InterruptedException , but I forgot I was in a non-UI thread.
What a stupid mistake....

The solution is easy:
put the toast notification in a separate runnable task and post it to the UI thread with a handler created in UI thread


Here in the class LoadingTask2:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. class LoadingTask2 implements Runnable{
  2.  
  3.                 private Handler localHandler;
  4.  
  5.                 private Handler remoteHandler;
  6.  
  7.                 public LoadingTask2(Handler remotehandler){
  8.  
  9.                         this.remoteHandler=remotehandler;
  10.  
  11.                         localHandler=new Handler();
  12.  
  13.                 }
  14.  
  15.                 public Handler getLocalHandler(){
  16.  
  17.                         return localHandler;
  18.  
  19.                 }
  20.  
  21.                 @Override
  22.  
  23.                 public void run() {                    
  24.  
  25.                         try {
  26.  
  27.                                 Thread.sleep(10000);
  28.  
  29.                                 remoteHandler.post(AsyncLoadingMgrSample.this.finishLoadingTask);
  30.  
  31.                         } catch (InterruptedException e) {
  32.  
  33.                                 /*
  34.  
  35.                                  * Exception is thrown because:
  36.  
  37.                                  *
  38.  
  39.                                  * Toast has to be shown by an UI thread, or non-UI thread can't create a toast
  40.  
  41.                                  *
  42.  
  43.                                  * Toast.makeText(AsyncLoadingMgrSample.this,"loading task error",Toast.LENGTH_LONG).show();
  44.  
  45.                                  */
  46.  
  47.                                
  48.  
  49.                                 /*
  50.  
  51.                                  * put the toast notification in a separate runnable task
  52.  
  53.                                  * and post it to the UI thread with a handler created in UI thread
  54.  
  55.                                  */
  56.  
  57.                                 remoteHandler.post(AsyncLoadingMgrSample.this.cancelLodingTask);
  58.  
  59.                                
  60.  
  61.                                 Log.i("LoadingTask2:Run","loading task interrupted");
  62.  
  63.                         }
  64.  
  65.                        
  66.  
  67.                 }
  68.  
  69.        
  70.  
  71.         }
Parsed in 0.034 seconds, using GeSHi 1.0.8.4
Best regards,

Rader
Rader
Freshman
Freshman
 
Posts: 6
Joined: Thu Mar 06, 2008 8:10 am
Location: China

Top

Return to Other Coding-Problems

Who is online

Users browsing this forum: No registered users and 11 guests