0

以下代码当前在我的main的onCreate()中运行。我现在只是在测试。我一直试图在AsyncTask中完成这项工作,因为我们的目标是能够稍后动态更新这些内容,但似乎无法找到如何做到这一点。我想知道是否有人有一些见解。谢谢!使用AsyncTask更新UI(动态布局)

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. 

    } 
} 

这里这段代码是我为我的异步和定义的布局和按钮创建为实例中mainactivity,只是为了测试和理解这一点,但我得到的错误,我一直在围绕操纵它,但似乎没有上班。

回答

1

我必须做同样的事情(充气/加一次80-120左右自定义视图为滚动布局),而我的AsyncTask结构是这样的:

首先,你需要通过你的ContextLinearLayout添加到您的AsyncTask。只需使用自定义构造函数即可。

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

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

onProgressUpdate():按照您喜欢的方式(text/padding/etc)设置按钮(从上方传递),并将其添加到布局。

onPostExecute():关闭对话框。

一个说明,使用一个线程来扩充和一个布局不会提高速度。没有一个AsyncTask的时间从大约2.5秒变成了超过2个。但是,通过这种方式,它可以提供一个清晰的进度对话框,而不是在UI膨胀所有视图时挂起。它可能不会更快,但感觉反应更灵敏,这才是真正重要的。

编辑: 对于定制构造的一个例子,检查this question。它还显示了如何跳过构造函数并将其直接传递给doInBackground()方法。无论哪种方式工作得很好。

+0

”首先,您需要将Context和LinearLayout传递给AsyncTask,只需使用自定义构造函数即可。“究竟是什么样子,对于愚蠢的问题抱歉,只是有点困惑。 – thekevshow

+0

添加到答案的链接。 – Geobits

+0

我添加了更多的代码,关于异步我会去关于自定义构造函数后,我得到这个测试工作,并理解它好一点,只是好奇,如果你可以看看看什么是错的。 – thekevshow

0

AsyncTasks通常用于较长的后台操作。所以除非你希望在完成这样的任务之后更新你的按钮,我不确定你为什么要使用它。然而,如果这确实是你的目的,那么你会在你的AsyncTask的doInBackground()函数中执行你需要的任何任务/代码。完成后,AsyncTask的onPostExecute()函数就是您相应更新UI的位置。

也许您可以在“动态加载”的要求中加入更多的细节,以便社区可以为您提供更具体的答案。

+0

如果您需要更多的代码,请告诉我,但实质上将该按钮想象为调用多达100或200个将被移除并添加到可滚动布局的布局中。代码完成后,这将是一个更长的操作。我也使用拉下来刷新以更新这些,这就是为什么我认为异步方法是适当的。上述行动本质上是我测试时需要完成的唯一例子。尽管如此,感谢您的洞察力,但如果我没有足够的描述性,请告诉我。 “ – thekevshow