【问题标题】:pass parameters to asyntask将参数传递给异步任务
【发布时间】:2013-10-09 06:49:25
【问题描述】:

我有个问题,就是我用AsynTask来控制一个线程,而且我只调用了一次AsynTask,但是现在我想做的就是调用不止一次,当然为此我得花几个参数,但不知道该怎么做,我已经尝试了数千种方法但不起作用。在这里我留下我的代码:

     public class leer_registros extends Activity {
    TextView text, depurar;
    EditText reg,ip;
    Button boton;
    float resultado;
    AccionesScada accionesScada = new AccionesScada();


    InetAddress addr = null;        //direccion del esclavo
    int port = Modbus.DEFAULT_PORT;//puerto por defecto 502 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.lblRegistro);
        ip = (EditText) findViewById(R.id.txtIp);
        reg = (EditText) findViewById(R.id.txtReg);
        depurar = (TextView) findViewById(R.id.txtdepurar); 
        boton = (Button)findViewById(R.id.btnVerRegistro);
        depurar.setTextColor(Color.RED);
    }
    public class conectar extends AsyncTask<Void,Void,Void>{
        int m;
        int startReg;
        int count;
        String dirIP;
        String dirReg;



        public conectar(String aux,String aux1) {
        this.dirIP=aux;
            this.dirReg=aux1;


            try {

                //IP address;
                //aux1 = ip.getText().toString();
                addr = InetAddress.getByName(dirIP);
                //aux = reg.getText().toString();
                startReg = Integer.decode(dirReg).intValue();
                depurar.setText(dirIP);
                //Reg = startReg[0];

            } catch (Exception e) {
                Log.d("MODBUS","IP error", e);

            }
        }

         protected  Void doInBackground(Void... urls) {



             m = accionesScada.conectar(addr, port);
             resultado = accionesScada.LeerRegistro(startReg, count);

             return null;


         }


         protected void onPostExecute(Integer bytes) {
             if(m==1){
                 depurar.setText("conectado!!!");
                 depurar.setTextColor(Color.GREEN);
            }
                 String resul = String.valueOf(resultado);
                 text.setText(resul); 
         }
    }


    public void verRegistro(View v)  {
        final Handler handler = new Handler();
        Timer timer = new Timer();

        //IP address;
         final String aux = ip.getText().toString();
         final String aux1 = reg.getText().toString();
        TimerTask doAsynchronousTask = new TimerTask() {
        @Override

        public void run() {
            handler.post(new Runnable() {

                @Override
                public void run() {
                    try{ 
                         depurar.setText(aux1);
                        /*conectar conectamos = new conectar();
                        conectamos.execute(aux,aux1);*/
                        conectar conectamos = new conectar(aux,aux1);
                        conectamos.execute();

                    }catch(Exception e){
                        Log.d("MODBUS", "Error Timertask");
                    }

                }

            });

        }

        }; 
        timer.schedule(doAsynchronousTask, 0, 1000);
    }

}

我希望你将其传递给函数:aux 和 aux1。 请帮我!。 谢谢。

【问题讨论】:

  • 可以直接传给asynctask的构造函数或者doInbackground。

标签: android parameter-passing


【解决方案1】:

在 Async Task 中创建一个构造函数以将参数传递给它。像这样

调用异步任务

new conectar(url,_payload,method,context).execute();

带构造函数的 AsycTask

private static class Conectar extends
            AsyncTask<Integer,Integer,Integer> {


        private final String mUrl;
        private final String mPayload;
        private final HttpMethod mMethod;
        private final Context mContext;

        public Conectar(String url,String _payload, HttpMethod method,final Context context) {

            mContext = context;
            mUrl=url;
            mPayload=_payload;
            mMethod=method;
        }

        @Override
        protected Integer doInBackground(Void... vParams) {
            ResponseWrapper user = null;
            String url = mUrl;

【讨论】:

  • 当我调用 asynTask: new conectar(aux,aux1).execute();我遇到问题并告诉我连接未定义
  • 我已经更新了我的代码,但我会像你说的那样说,问题是当我把 conectamos.execute 不输入。即不在异步任务中
  • 不,没有解决,我很绝望,我现在已经更新了我的代码,我已经在上面概述了。我的问题仍然是传递参数不起作用,即连接参数的好时机,但是,当我调用 accionesScada.conectar (..,) 时,我得到一个错误并且没有连接,好像没有读好发生了什么参数。我把我的代码更新了看看有没有错误...非常感谢=)
【解决方案2】:
conectar conectamos = new conectar();
conectamos.execute(1, 2, 3);// Pass the parameter like this



// Get the parameter like this
protected Integer doInBackground(Integer... urls) {
  int parameter1=urls[0];
  int parameter1=urls[1];
  int parameter1=urls[2];


}

已编辑:-

当您将第一个参数声明为整数但您传递的是字符串时。 所以把它改成字符串就行了。

public class conectar extends AsyncTask<String,Integer,Integer>

【讨论】:

  • 步进参数如下:String aux = new String();字符串 aux1 = 新字符串(); aux1 = ip.getText().toString();辅助 = reg.getText().toString(); conectar conectamos = 新的 conectar(); conectamos.execute(aux,aux1);我有一个问题,显然没有进入函数 AsyncTask 为什么??
  • @Isma9 问题是因为您在 AsynTask 中为第一个参数声明了 Integer。但是您需要传递字符串值,因此将数据类型更改为字符串。查看我的更新答案,
  • 我编辑了我的帖子,看我的帖子。我有问题,显然没有进入函数AsyncTask。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多