我在使用android應用中的線程時遇到了一些問題。如何從線程更新UI?
我有Activity1.java它有一些功能,從sql lite數據庫中獲取數據並將其顯示在活動上。我有一個方法Load(),它填充了一些微調器的靜態和一些來自數據庫。第二個微調值取決於第一個下拉菜單,依此類推。它還顯示/隱藏一些UI控件
場景1: -
如果我們呼叫負載上onCreate()方法()函數,那麼活動會放緩。
方案2: - (線程)
如果我們呼叫負載()內螺紋上onCreate()方法的功能和我使用runOnUiThread或Handler.post更新UI控件,那麼它會跳過該代碼,進一步在代碼和我的其他值是有些錯誤或不正確來。
方案3: - (異步)
如果我們呼叫負載()內Aysnc在onCreate()方法的功能,然後我不得不從異步任務不斷更新的用戶界面。 UI中的更新只允許在onPostExecute(Result)和onProgressUpdate(Progress ...)上進行,但我如何從異步持續更新ui。
@Override
protected void onCreate(Bundle savedInstanceState) {
BindStaticValues();
GetCalculationOptions();
}
public void BindStaticValues()
{
//standard
BindStandard(); //static spinner (not db)
//Spinner 1
array1 = new ArrayList<ObjectMaterial>();
Adapter1 = new DescriptionAdapter(this,
android.R.layout.simple_spinner_item,
array1);
Adapter1
.setDropDownViewResource(android.R.layout.simple_spinner_item);
sp1.setAdapter(Adapter1);
//Spinner 2
array2 = new ArrayList<ObjectMaterial>();
Adapter2 = new DescriptionAdapter(this,
android.R.layout.simple_spinner_item,
array2);
Adapter2
.setDropDownViewResource(android.R.layout.simple_spinner_item);
sp2.setAdapter(Adapter2);
}
public void GetCalculationOptions()
{
progressCalcualtionOptions = ProgressDialog.show(context, getString(R.string.progressCalcualtionOptionsTitle),
getString(R.string.progressCalcualtionOptionsMessage), true);
new Thread(new Runnable() {
public void run() {
try
{
LoadValuesforFirstTime(false, false, false); //main load method (Need Updating UI)
isFirstOpen=false;
}
catch (Exception e) {
//Log.d(Constants.TAG, e.getMessage());
e.printStackTrace();
}
if (progressCalcualtionOptions != null)
{
progressCalcualtionOptions.dismiss();
progressCalcualtionOptions=null;
}
}
}).start();
}
private void LoadValuesforFirstTime(Boolean FromMaterial,
Boolean FromLangugae, Boolean FromCountry) {
ChangeVisibility(); // it will change visibility of some controls
FillSpinner1(TypeofMaterial); //fill first spinner 1
FillSpinner2(ObjectMaterial); //fill first spinner 2 (take values from spinner 1 or manipulate values in spinner 1)
}
private void ChangeVisibility() {
// it will change visibility of some controls
runOnUiThread(new Runnable() {
public void run() {
relat_heightPipe.setVisibility(View.GONE);
relat_PipeDiameter.setVisibility(View.GONE);
relat_WidthPipe.setVisibility(View.GONE);
relat_length.setVisibility(View.GONE);
relat_lblMediumHeatCapacity.setVisibility(View.GONE);
relat_lblMediumDensity.setVisibility(View.GONE);
}
});
}
private void FillSpinner1(String TypeofMaterial) {
array1 = DB_Manager.All(); //get from db
h.post(new Runnable() {
public void run() {
Adapter1.clear();
for (ObjectMaterial object : array1)
Adapter1.add(object);
Adapter1.notifyDataSetChanged();
}
});
}
private void FillSpinner2(String TypeofMaterial) {
array2 = DB_Manager.All1(spinner1.getSelectedItemPosition()); //get from db
h.post(new Runnable() {
public void run() {
Adapter2.clear();
for (ObjectMaterial object : array2)
Adapter2.add(object);
Adapter2.notifyDataSetChanged();
}
});
}
現在,問題是: -
當活動開啓,GetCalculationOptions調用線程來填補所有微調值。在這裏它調用LoadValuesforFirstTime()函數。在這裏我用db和ui做所有事情。 這裏changevisibility改變了一些控件的可見性,FillSpinner1從db中獲取值,在主UI線程中刷新適配器,填充Spinenr2根據在微調器1中選擇的值從db中獲取值,但是沒有值會在spinner1中找到,因爲它沒有被填充直到現在,它是另一個線程,現在我們必須從LoadValuesforFirstTime()函數不斷更新UI。
任何人,PLZ幫助我或建議我任何其他選項來實現這一點。
如果我運行主要UI線程上的所有功能,然後活動變慢。 –
只是在run方法中調用該方法,該方法負責更新ui。 –