2011-07-09 127 views
0

我想品牌的AsyncTask类做后台更新调用者线程的进展,但调用者线程!=的UI线程。 我试过这段代码,但行publishProgress(i)似乎没有效果。 有人可以告诉我如何解决它(或者我可以使用其他类)。 在此先感谢=)Asynctask一个UI线程

public class MainUI extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       Thread t=new Thread(){ 
        boolean exit=false; 
        public void run(){ 
         Looper.prepare(); 
         new DownloadFilesTask().execute(); 

         while (!exit){ 
          try { 
           Thread.sleep(600); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 

         Log.d("","Exit thread"); 

         Looper.loop(); 
        } 

        public void exit(){ 
         exit=true; 
        } 

        class DownloadFilesTask extends AsyncTask<Void, Long, Long> { 
         protected Long doInBackground(Void... urls) { 
          long i=0; 
          for (i=0;i<20;i++){ 
           Log.d("",i+" "); 
           try { 
            Thread.sleep(500); 
           } catch (InterruptedException e) { 
            e.printStackTrace(); 
           } 
           publishProgress(i); 
           } 
          return i; 
         } 
         protected void onProgressUpdate(Long... progress) { 
          Log.d("Test",progress[0]+""); 
             } 

             protected void onPostExecute(Long result) { 
              exit(); 
             } 
            } 


           }; 
           t.start(); 


          } 

         }); 
        } 





} 

回答

0

从Android文档:

有必须遵循这一类工作的几个线程规则正确:

必须在UI线程上创建任务实例。

execute(Params...) must be invoked on the UI thread. 
Do not call onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) manually. 
The task can be executed only once (an exception will be thrown if a second execution is attempted.) 

,所以你不能在UI线程之外创建它。改为使用Task并将其包装在ThreadPoolExecutor对象中。要知道,你需要使它线程安全使用其中的一个更新UI时:

Activity.runOnUiThread(Runnable) 
View.post(Runnable) 
View.postDelayed(Runnable, long) 

但再次的AsyncTask是无用的,我不建议这样做。

问候

+0

来吧,当然的AsyncTask有它的用途。你只需要了解它是如何工作的,就像任何库函数/类一样。 – dhaag23