2013-11-10 38 views
1

我想創建ListView,每4秒添加一個項目並將焦點設置爲最後一個項目。 問題是,我的片段等待的AsyncTask結束,然後才顯示(所有時間的AsyncTask工作的白色屏幕)更新ListView而不凍結UI

public class LogFragment extends SherlockFragment { 
    private ListView lvList; 
    private ArrayAdapter<String> adapter; 
    private UpdateTask mTask = null; 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile" }; 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.log_fragment, container, false); 
     lvList = (ListView) view.findViewById(R.id.lvLog); 
     final ArrayList<String> list = new ArrayList<String>(); 
     for (int i = 0; i < values.length; ++i) { 
      list.add(values[i]); 
     } 
     adapter = new ArrayAdapter<String>(getSherlockActivity(), 
       android.R.layout.simple_list_item_1, list); 
     lvList.setAdapter(adapter); 
     return view; 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d("myLogs", "LogFragment:OnCreate"); 
     mTask = new UpdateTask(); 
     super.onCreate(savedInstanceState); 
     mTask.execute(); 
    } 

而且我AnyncTask:

public class UpdateTask extends AsyncTask<Void, Void, Void> { 
     int temp = 10; 

     protected Void doInBackground(Void... params) { 
      getSherlockActivity().runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        while (temp-- > 0) { 
         try { 
          TimeUnit.SECONDS.sleep(4); 
          adapter.add("Lol" + String.valueOf(temp)); 
          lvList.setSelection(lvList.getAdapter().getCount() - 1); 
          Log.d("myLogs", "Added from Async"); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 

      return null; 

     } 

     protected void onPostExecute(String result) { 
     } 
    } 

如何解決我的問題?

+0

adapter.add(「Lol」...) - LOL! –

+0

好的,什麼? :/ – Sunstrike

+0

我以爲你在開玩笑。您啓動了一個AsyncTask,在UI線程上啓動另一個線程來更新循環中的UI並進入睡眠狀態。我認爲這是一個笑話。抱歉。 –

回答

0

請看看TimerTask,不要像現在這樣使用AsyncTask。 AsyncTask背後的想法是不在UI線程上進行計算,並且用這個runOnUiThread()東西再次阻塞UI線程。如果您想在doInBackground()方法中使用自定義AsyncTask實現睡眠,並將結果解析回onPostExectue()方法中的UI。切勿在doInBackground()方法中使用對lvList等UI線程的引用。如果你想這樣做使用WeakReference