Java 使用AsyncTask更新UI(动态布局)

Java 使用AsyncTask更新UI(动态布局),java,android,android-layout,user-interface,android-asynctask,Java,Android,Android Layout,User Interface,Android Asynctask,以下代码当前在我的main的onCreate()中运行。我现在只是在测试。我一直在尝试在一个异步任务中实现这一点,因为目标是能够在以后动态更新这些任务,但似乎无法找到如何做到这一点。我想知道是否有人有一些见解。谢谢大家! LinearLayout ObjectLayout = (LinearLayout) findViewById(R.id.LayoutObjects); RelativeLayout.LayoutParams params = new RelativeLayout.L

以下代码当前在我的main的onCreate()中运行。我现在只是在测试。我一直在尝试在一个异步任务中实现这一点,因为目标是能够在以后动态更新这些任务,但似乎无法找到如何做到这一点。我想知道是否有人有一些见解。谢谢大家!

LinearLayout ObjectLayout = (LinearLayout) findViewById(R.id.LayoutObjects);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.height = 140;
    params.width = 140;
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    for (int i = 0; i < 10; i++) {

        Button btn = new Button(this);
        btn.setLayoutParams(params);
        btn.setPadding(0, 50, 0, 0);
        btn.setTextSize(14);
        btn.setText("MyButton");
        btn.setTextColor(color.Yellow);
        // Drawable image = Drawable.createFromPath("@drawable/add_page");
        // //
        // btn.setBackgroundDrawable(image);

        btn.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.add_page));
        // btn.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

        ObjectLayout.addView(btn);

    }




private class GetDataTask2 extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {

        // Simulates a background job.

        for (int i = 0; i < 10; i++) {
            publishProgress(btn2);
        }

        return null;
    }

    protected void publishProgress(Button btn2) {
        btn2.setLayoutParams(params2);
        btn2.setPadding(0, 50, 0, 0);
        btn2.setTextSize(14);
        btn2.setText("MyButton yo yo yo ");
        btn2.setTextColor(color.Yellow);

        btn2.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.add_page));
        ObjectLayout2.addView(btn2);
        // Process width and height
    }

    protected void onPostExecute() {
        // Do some stuff here

        // Call onRefreshComplete when the list has been refreshed.

    }
}
LinearLayout ObjectLayout=(LinearLayout)findViewById(R.id.layoutuobjects);
RelativeLayout.LayoutParams params=新的RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
参数高度=140;
参数宽度=140;
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
对于(int i=0;i<10;i++){
按钮btn=新按钮(此按钮);
btn.setLayoutParams(参数);
设置填充(0,50,0,0);
btn.SettexSize(14);
btn.setText(“MyButton”);
btn.setTextColor(颜色为黄色);
//Drawable image=Drawable.createFromPath(@Drawable/add_page));
// //
//btn.可缩回地面绘制(图像);
btn.setBackgroundDrawable(getResources().getDrawable(
R.可绘制。添加(页面));
//btn.SetCompoundDrawablesWithinInsticBounds(0,0,0,0);
ObjectLayout.addView(btn);
}
私有类GetDataTask2扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
//模拟后台作业。
对于(int i=0;i<10;i++){
出版进度(btn2);
}
返回null;
}
受保护的无效发布进度(按钮btn2){
btn2.setLayoutParams(params2);
btn2.设置填充(0,50,0,0);
btn2.setTextSize(14);
btn2.setText(“MyButton yo yo”);
btn2.setTextColor(颜色为黄色);
btn2.setBackgroundDrawable(getResources().getDrawable(
R.可绘制。添加(页面));
ObjectLayout2.addView(btn2);
//工艺宽度和高度
}
受保护的void onPostExecute(){
//在这里做些事情
//刷新列表后,调用onRefreshComplete。
}
}

这里的代码是我的异步代码,并在mainactivity中将布局和按钮创建定义为实例,只是为了测试和理解这一点,但我遇到了错误,我一直在处理它,但似乎没有任何效果

异步任务通常用于长时间的后台操作。所以,除非你想在完成这样的任务后更新你的按钮,否则我不知道你为什么要使用它

但是,如果这确实是您的目的,那么您将在AsyncTask的doInBackground()函数中执行所需的任何任务/代码。完成后,AsyncTask的onPostExecute()函数将相应地更新UI


也许您可以包含更多关于“动态加载”需求性质的详细信息,以便社区可以为您提供更具体的答案。

我必须做类似的事情(将大约80-120个自定义视图一次膨胀/添加到可滚动布局中),我的AsyncTask结构如下所示:

首先,需要将
上下文
线性布局
传递给异步任务。只需为此使用自定义构造函数

onPreExecute()
:显示进度对话框或显示“忙碌”的内容

doInBackground()
:在循环中创建与您一样的按钮,但不要超过该线程上的按钮。创造/膨胀部分占用了大部分时间,因此无需担心。在每个循环周期结束时,
publishProgress(btn)

onProgressUpdate()
:按您喜欢的方式(文本/填充等)设置按钮(从上方传递),并将其添加到布局中

onPostExecute()
:关闭对话框

需要注意的是,使用一根线充气,一根线布局并不能大大提高速度。我的任务从没有异步任务的大约2.5秒增加到有异步任务的略多于2秒。然而,通过这种方式,它提供了一个清晰的进度对话框,而不是在膨胀所有视图时挂起的UI。它可能不会快很多,但感觉更灵敏,这才是真正重要的

编辑:
有关自定义构造函数的示例,请选中。它还显示了如何跳过构造函数并将其直接传递给
doInBackground()
方法。任何一种方法都可以。如果您需要更多的代码,请告诉我,但基本上可以将该按钮视为调用多达100或200个将被删除并添加到可滚动的布局中。当代码最终确定时,这将是一个更长的操作。我还使用下拉刷新来更新这些,这就是为什么我认为异步方法是合适的。上面的操作本质上是我正在测试的需要在那里完成的唯一示例。不过,感谢您对这一点的深入了解,如果我的描述不够详细,请告诉我。“首先,您需要将上下文和线性布局传递给AsyncTask。只需使用自定义构造函数即可。”这到底是什么样子,很抱歉问了一个愚蠢的问题,只是有点困惑。我在async中添加了更多的代码,在我完成测试并更好地理解它之后,我打算使用一个自定义构造函数,只是好奇你是否可以看看有什么问题。