0

我在使用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幫助我或建議我任何其他選項來實現這一點。

回答

0

doInbackground方法調用

runOnUiThread(new Runnable(){ 
     public void run() { 

        write your method here 

     } 
    }); 

你的方法。

+0

如果我運行主要UI線程上的所有功能,然後活動變慢。 –

+0

只是在run方法中調用該方法,該方法負責更新ui。 –