Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从线程更新UI?_Android_Performance_Android Intent_Database Performance_Query Performance - Fatal编程技术网

Android 如何从线程更新UI?

Android 如何从线程更新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()函数

我在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(进度…)上进行,但我如何从异步连续更新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();
            }
        });
}
@覆盖
创建时受保护的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方法中调用该方法。