Android 如何从线程更新UI?
我在android应用程序中使用线程时遇到了一些问题 我有Activity1.java,它有一些函数,可以从SQLLite数据库中获取数据,并将其显示在activity上。我有一个Load()方法,它填充了一些spinner static和一些数据库。第二个微调器值取决于第一个下拉列表,依此类推。它还可以显示/不显示某些UI控件 情景1:- 若我们在oncreate()方法上调用Load()函数,那个么活动将变慢 场景2:-(线程) 如果我们在oncreate()方法的线程内调用Load()函数,并且我使用runOnUiThread或Handler.post来更新ui控件,那么它将跳过该代码,在代码中进一步执行,并且我的其他值有一些错误或不正确 场景3:-(异步) 若我们在oncreate()方法的Aysnc中调用Load()函数,那个么我必须从异步任务中不断更新ui。UI中的更新只允许在onPostExecute(结果)和onProgressUpdate(进度…)上进行,但我如何从异步连续更新UIAndroid 如何从线程更新UI?,android,performance,android-intent,database-performance,query-performance,Android,Performance,Android Intent,Database Performance,Query Performance,我在android应用程序中使用线程时遇到了一些问题 我有Activity1.java,它有一些函数,可以从SQLLite数据库中获取数据,并将其显示在activity上。我有一个Load()方法,它填充了一些spinner static和一些数据库。第二个微调器值取决于第一个下拉列表,依此类推。它还可以显示/不显示某些UI控件 情景1:- 若我们在oncreate()方法上调用Load()函数,那个么活动将变慢 场景2:-(线程) 如果我们在oncreate()方法的线程内调用Load()函数
@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();
}
});
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
BindStaticValues();
GetCalculationOptions();
}
public void BindStaticValues()
{
//标准
BindStandard();//静态微调器(非db)
//旋转器1
array1=新的ArrayList();
适配器1=新的描述适配器(此,
android.R.layout.simple\u微调器\u项,
阵列1);
适配器1
.setDropDownViewResource(android.R.layout.simple\u微调器\u项);
设置适配器(适配器1);
//旋转器2
array2=新的ArrayList();
Adapter2=新描述适配器(此,
android.R.layout.simple\u微调器\u项,
阵列2);
适配器2
.setDropDownViewResource(android.R.layout.simple\u微调器\u项);
sp2.设置适配器(适配器2);
}
公共无效GetCalculationOptions()
{
ProgressCalculationOptions=ProgressDialog.show(上下文,getString(R.string.ProgressCalculationOptions),
getString(R.string.ProgressCalculationOptionMessage),true;
新线程(newrunnable()){
公开募捐{
尝试
{
LoadValuesforFirstTime(false,false,false);//主加载方法(需要更新UI)
isFirstOpen=false;
}
捕获(例外e){
//Log.d(Constants.TAG,e.getMessage());
e、 printStackTrace();
}
if(progressCalculationOptions!=null)
{
ProgressCalculationOptions.Disclease();
ProgressCalculationOptions=null;
}
}
}).start();
}
private void LoadValuesforFirstTime(布尔值FromMaterial,
Boolean from语言,Boolean from国家){
ChangeVisibility();//它将更改某些控件的可见性
填充喷丝头1(材料类型);//填充第一个喷丝头1
FillSpinner 2(ObjectMaterial);//填充第一个spinner 2(从spinner 1获取值或操纵spinner 1中的值)
}
私有void ChangeVisibility(){
//它将更改某些控件的可见性
runOnUiThread(新的Runnable(){
公开募捐{
relat_heightPipe.setVisibility(View.GONE);
相关管道直径设置可见性(视图消失);
relat_WidthPipe.setVisibility(View.GONE);
相对长度设置可见性(视图已消失);
相对中热容。设置可见性(视图。消失);
相对密度。设置可见性(视图。消失);
}
});
}
专用空白填充喷丝头1(材料的字符串类型){
array1=DB_Manager.All();//从DB获取
h、 post(新的Runnable(){
公开募捐{
适配器1.clear();
对于(ObjectMaterial对象:array1)
适配器1.添加(对象);
Adapter1.notifyDataSetChanged();
}
});
}
专用空白填充喷丝头2(材料的字符串类型){
array2=DB_Manager.All1(spinner1.getSelectedItemPosition());//从DB获取
h、 post(新的Runnable(){
公开募捐{
适配器2.clear();
对于(ObjectMaterial对象:array2)
适配器2.添加(对象);
Adapter2.notifyDataSetChanged();
}
});
}
现在,问题是:-
当“活动”打开时,GetCalculationOptions调用一个线程来填充所有微调器值。在这里,它调用LoadValuesforFirstTime()函数。
此处changevisibility更改某些控件的可见性,FillSpinner1 fill从db获取值,刷新主ui线程内的适配器,fill Spiner2根据spinner1中选定的值从db获取值,但spinner1中找不到值,因为它到目前为止尚未填充,并且是另一个线程,现在,我们必须从LoadValuesforFirstTime()函数不断更新UI
任何人,请帮助我或建议我实现此目标的任何其他选项。请致电您的方法
runOnUiThread(new Runnable(){
public void run() {
write your method here
}
});
从
doInbackground
method.如果我在主ui线程上运行所有函数,那么活动就会变慢。只需在负责更新ui的run方法中调用该方法。