2012-02-03 145 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