2012-02-03 143 views
0

我想在不同的线程中获取谷歌日历名称后更新微调对象。当我执行这个时,它崩溃。我不确定是否需要使用不同的方法进行工作,或者如果有什么问题。android - 更新进度条

private void updateGoogleCalendar() { 
    try { 
     Thread.sleep(4000); 
     List<String> list = new ArrayList<String>(); 
     list.add("Sample Calendar"); 
     updatedCalendarNames = list.toArray(new String[0]); 
     progressBar.dismiss(); 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
public void initializeWidgets() { 
    final Spinner spinner = (Spinner) layout.findViewById(R.id.googleCalendarSelection); 
    final Button refreshCalendarBtn = (Button) layout.findViewById(R.id.refreshCalendarBtn); 
    refreshCalendarBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     progressBar = ProgressDialog.show(getContext(), "", "Loading..."); 
     new Thread(new Runnable() { 

     @Override 
     public void run() { 
     updateGoogleCalendar(); 
     final ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
     while (updatedCalendarNames == null) { 
      try { 
       Thread.sleep(500); 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
      for (String calendarName : updatedCalendarNames) { 
      CharSequence charSequence = calendarName + ""; 
      adapter.add(charSequence); 
      }      
      } 
     }).start(); 
     } 
    }); 
    } 
+0

你能显示logcat输出? – bluefalcon 2012-02-03 04:24:33

回答

1

你需要添加你的UI更新代码到事件线程只,并通知UI/Event线程需要实现处理程序或的AsyncTask,比如你可以通过处理器更新如下:

public void initializeWidgets() { 

    final Spinner spinner = (Spinner) layout.findViewById(R.id.googleCalendarSelection); 


    final Button refreshCalendarBtn = (Button) layout.findViewById(R.id.refreshCalendarBtn); 
    refreshCalendarBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      progressBar = ProgressDialog.show(getContext(), "", "Loading..."); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        updateGoogleCalendar(); 
        final ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), android.R.layout.simple_spinner_item); 
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        spinner.setAdapter(adapter); 

        while (updatedCalendarNames == null) { 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
        for (String calendarName : updatedCalendarNames) { 
         Message msg=handler.obtainMessage(); 
         msg.obj = calendarName + ""; 
         handler.sendMessage(msg); 
        }      
       } 
      }).start(); 
     } 
    }); 

} 


Handler handler=new Handler() 
{ 
    public void handleMessage(Message msg) 
    { 
     String str=(String)msg.obj; 
     adapter.add(charSequence); 

    } 
}; 
+0

非常感谢。它工作正常。 – user826323 2012-02-03 06:28:31

1

你不说其中崩溃或者怎么样,但我想它可能是由于你试图更新从非UI线程的UI。请参阅AsyncTask(请参阅here)以获取信息。

+0

抱歉的解释不足。它发生在adapter.add(charSequence); – user826323 2012-02-03 04:24:12