在Asynctask中将视图作为参数发送

时间:2012-10-31 13:56:18

标签: android view android-asynctask parameter-passing

我正在编写一个代码,我在其中扩展视图,当用户单击一个视图时,我需要执行解析URL,然后检查解析是否返回给我。问题是我需要在asynctask解析中执行以避免异常,并在任务结束之前执行检查。

理想的做法是将视图作为参数发送到AsyncTask,以将我的所有代码发送到Asynctask。但不是如何做到最后

我把代码放在了容易理解的地方。

vMens.setOnClickListener(new View.OnClickListener() {

    public void onClick(View vMens) {
        int readOK=0;
        try{
            new taskMensaje(vMens).execute();

            if(mess_gest.equals("1")){
                readOK=1;
            }else{
                readOK=0;
            }
        }catch(Exception e){
            Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje");
        }
            if (readOK==0){
                Mess.state = message.get(vMens.getId()).p1;
                Mess.tittle = message.get(vMens.getId()).p2;
            else{
                //message no gest
            }
    }
});
private class taskMensaje extends AsyncTask<String, Void, View> {

    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return "";
    }
}

有什么想法解决这个问题吗?

谢谢,抱歉我的英语不好

4 个答案:

答案 0 :(得分:7)

您可以将它作为参数添加到构造函数中,并将其存储在AsyncTask对象上。 将其存储为WeakReference并在onPostExecute上进行检查,就像在http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

上显示来自官方文档的图像的最佳做法一样
private class TaskMensaje extends AsyncTask<String, Void, Void> {
   private WeakReference vRef;
   ... / your other stuff here   

   public TaskMensaje (View v) {
       vRef = new WeakReference(v);
   }


    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return null;
    }

    @Override
    protected onPostExecute(Void result) {
        if (vRef != null && bitmap != null) {
           final ImageView imageView = vRef.get();
           if (imageView != null) {
               // Do whatever you want with your ImageView
               ...
           }
       }
    }
}
BTW,请参阅AsyncTask参考文档,了解如何在类定义中使用泛型参数;-) 在http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:1)

您可以在异步任务中创建一个构造函数,通过该构造函数可以传递视图并在需要时在asynctask中使用它。

喜欢下面

private class taskMensaje extends AsyncTask<String, Void, String> {

    private View _view 
    public taskMensaje(View view){
        this._view = view; // this you can use ahead wherever required
    }

    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return "";
    }
}

答案 2 :(得分:1)

如果您想将View作为参数发送到AsyncTask,简短答案是不要

视图来去匆匆,当你的AsyncTask完成时,你的View已经死了并且已经消失,并且尝试访问它不会给你任何东西除了悲伤和沮丧。

异步处理数据的正确模式是创建一个单独的数据处理类,Observable并包括所有AsyncTasks,铃声和口哨声。并使View类成为Observer,注册接收更新并等待数据处理并通过update()回调提供给它。

请记住,AsyncTask是故意从UI进行 SEPARATE 数据处理,尝试将其绑定回来是完全不合逻辑的。

答案 3 :(得分:0)

试试这个

 vMens.setOnClickListener(new View.OnClickListener() {

        public void onClick(View vMens) {
            int readOK=0;
            try{
                new taskMensaje().execute(vMens);

                if(mess_gest.equals("1")){
                    readOK=1;
                }else{
                    readOK=0;
                }
            }catch(Exception e){
                Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje");
            }
                if (readOK==0){
                    Mess.state = message.get(vMens.getId()).p1;
                    Mess.tittle = message.get(vMens.getId()).p2;
                else{
                    //message no gest
                }
        }
    });

private class taskMensaje extends AsyncTask<View, Void, String> {



     @Override
        protected String doInBackground(View... params) {
           //Do what ever you want to do with this view
    View v=params[0];
            return "";
        }
    }