2013-11-10 37 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