Android - 在AsyncTask onPostExecute中动态创建控件

时间:2013-10-12 19:25:02

标签: android android-asynctask

我正在努力更好地处理AsyncTask并尝试使用asyncTask的onPostExecute()动态创建控件。

我下面的代码确实有效,并且它创建了控件,但有没有办法循环它,但是延迟它以便在asynctask完成后变量I递增?

我已经阅读了使用get()方法,但我似乎无法使其工作。

有人可以建议如何等到后台任务完成或者根据变量号动态创建控件的其他方法吗?

package com.example.dynamicallycreatecontrols;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.Menu;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

            Integer i = 0;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            setContentView(R.layout.activity_main);

                            while (i < 5) {
                                                            new createControl().execute(i);
                                                            i++;
                            }

            }

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                            // Inflate the menu; this adds items to the action bar if it is present.
                            getMenuInflater().inflate(R.menu.main, menu);
                            return true;
            }


            //asynctask
            public class createControl extends AsyncTask<Integer, Void, Button> {


                            Button btn = new Button(MainActivity.this);
                            LinearLayout ll = (LinearLayout) findViewById (R.id.llMain);
                            LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

                            protected void onPreExecute(Integer i) {
                                            // nothing right now
                            }

                            @Override
                            protected Button doInBackground(Integer... arg0) {
                                            // TODO Auto-generated method stub
                                            // do the calculation

                                            return null;
                            }

                            protected void onPostExecute(Button v) {
                                            // build the controls here
                                            btn.setText("Play" + i);
                                            ll.addView(btn, lp);
                                            SystemClock.sleep(1000);

                            }


            }

}

我是android开发和java的新手,所以我不确定我是否只是误解了get()的概念,或者是否有更好的方法来完成这一切。

感谢您在协助中分配的任何时间。

-nick

2 个答案:

答案 0 :(得分:0)

doInBackground()完成后,我转移到onPostExecute()。我不需要任何延误。当我调用task.execute(/**/)实际上我调用doInBackground()异步任务时我并不关心它什么时候完成但是我知道我有回调onPostExecute()并且我等待并从那里更新我的主线程。

为了更清楚,可以说你有应用程序用户想要注册到服务器并更新GUI导致绿色。用户按下按钮并调用方法registerClient()

此方法运行:

private void registerClient(){
...
dialog = ProgressDialog.show(LoginActivity.this, "", "Connecting. Please wait...", true);
HeavyTask task = new HeavyTask();
task.execute(user, password, domain);   
}

那么我们在HeavyTask

中有什么
private class HeavyTask extends AsyncTask<String, Void, Void> {

        private String username = "";
        private String domain = "";
        private String password = "";

            // run async task 
        protected Void doInBackground(String... args) {         

            username = args[0];
            password = args[1];
            domain = args[2];               

            registerClientToServer(username, password, domain, null);               

            return null;
        } 

            protected void onPostExecute(Void results) {

        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {                 
                updateGUI(username, domain);                    
            }
        }, 500);            
    }
}

答案 1 :(得分:0)

为什么不创建一个对象并实例化它?你可以控制对象是否存在,或者它是否已经完成了他必须做的事情。

示例:

public class MainActivity extends Activity {
      private createControl cc = null;
      Integer i = 0;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);

                        while (i < 5) {
                             if (cc == null){
                                  cc = new createControl();
                                  cc.execute(i);
                                  i++;
                             }
                        }
        }

 ...

}

然后在onPostExecute中添加cc = null;