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

Android 在Asynctask中将视图作为参数发送,android,view,android-asynctask,parameter-passing,Android,View,Android Asynctask,Parameter Passing,我正在编写一个代码,其中我正在膨胀视图,当用户单击一个视图时,我需要执行URL解析,然后检查解析是否返回我。问题是我需要在asynctask解析中执行,以不获取异常,并在任务结束前执行检查 理想情况是将视图作为参数发送到AsyncTask,以便将我的所有代码发送到AsyncTask。但如何让这一切持续下去并不是问题 我写代码是为了让它更容易理解 vMens.setOnClickListener(new View.OnClickListener() { public void onCli

我正在编写一个代码,其中我正在膨胀视图,当用户单击一个视图时,我需要执行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 "";
    }
}
vMens.setOnClickListener(新视图.OnClickListener(){
公共void onClick(查看vmen){
int readOK=0;
试一试{
新的taskMensaje(vMens.execute();
如果(最大等于(“1”)){
readOK=1;
}否则{
readOK=0;
}
}捕获(例外e){
Utils.showDialog(Calendario.this,“错误”,“无任何错误”);
}
如果(readOK==0){
Mess.state=message.get(vMens.getId()).p1;
Mess.title=message.get(vMens.getId()).p2;
否则{
//信息无提示
}
}
});
私有类taskMensaje扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
mensajeragestionableparser parserMensGest=新的mensajeragestionableparser(urlMensGest);
gestionables=parserMensGest.parse();
mess_gest=gestiables.get(0.p0;
返回“”;
}
}
有什么办法解决这个问题吗


感谢并抱歉我的英语不好

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

如下

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 "";
    }
}
私有类taskMensaje扩展了异步任务{
私有视图
公共taskMensaje(视图){
this.\u view=view;//您可以在需要时提前使用它
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
mensajeragestionableparser parserMensGest=新的mensajeragestionableparser(urlMensGest);
gestionables=parserMensGest.parse();
mess_gest=gestiables.get(0.p0;
返回“”;
}
}
试试这个

 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 "";
        }
    }
vMens.setOnClickListener(新视图.OnClickListener(){
公共void onClick(查看vmen){
int readOK=0;
试一试{
新的taskMensaje().execute(vMens);
如果(最大等于(“1”)){
readOK=1;
}否则{
readOK=0;
}
}捕获(例外e){
Utils.showDialog(Calendario.this,“错误”,“无任何错误”);
}
如果(readOK==0){
Mess.state=message.get(vMens.getId()).p1;
Mess.title=message.get(vMens.getId()).p2;
否则{
//信息无提示
}
}
});
私有类taskMensaje扩展了异步任务{
@凌驾
受保护的字符串doInBackground(视图…参数){
//使用此视图执行任何您想要执行的操作
视图v=参数[0];
返回“”;
}
}

如果您想将
视图
作为参数发送到
异步任务
,简短的回答是

视图来了又去,当您的
异步任务
完成时,您的
视图
很有可能已经死了,试图访问它只会给您带来悲伤和挫折

异步处理数据的正确模式是创建一个单独的数据处理类,该类是可观察的,包括所有的异步任务、铃铛和口哨。并使您的视图成为一个观察者,它注册接收更新,只需等待数据被处理并恢复通过
update()


请记住,
AsyncTask
是有意将数据处理与UI分开的,试图将其绑定回去是完全不合逻辑的。

您可以将其作为构造函数的参数,并存储在AsyncTask对象上。 将其存储为WeakReference并在onPostExecute上检查,这与在

私有类TaskMensaje扩展了异步任务{
私人财富参考基金;
…你的其他东西在这里
公共任务管理(视图五){
vRef=新的WeakReference(v);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
mensajeragestionableparser parserMensGest=新的mensajeragestionableparser(urlMensGest);
gestionables=parserMensGest.parse();
mess_gest=gestiables.get(0.p0;
返回null;
}
@凌驾
受保护的onPostExecute(无效结果){
if(vRef!=null&&bitmap!=null){
final-ImageView=vRef.get();
如果(imageView!=null){
//使用ImageView执行任何操作
...
}
}
}
}
顺便说一句,请参阅AsyncTask ref文档以了解如何在类定义上使用泛型参数;-)

感谢您的回复,您已经在做什么?如何发送我的视图vMens?new taskMensaje(vMens).execute();为什么视图在asynctask中使用了第三个参数?第三个参数是doInBackground方法传递给onPostExecute方法的参数。您的意思是返回的字符串是视图?这几乎是正确的,您应该调用“new taskMensaje().execute(vMens)”这是非常危险的。Android
视图
对象不是线程安全的,在
doInBackground()
中对它们执行任何操作都可能导致间歇性的难以调试的崩溃。如果在解析完成后需要更新
视图
,请重写
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
               ...
           }
       }
    }
}