0

我正在努力更好地处理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() 的概念,或者是否有更好的方法可以一起完成这一切。

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

-缺口

4

2 回答 2

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;

于 2013-10-12T20:08:23.770 回答
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);            
    }
}
于 2013-10-12T19:30:19.280 回答