我正在编写一个代码,我在其中扩展视图,当用户单击一个视图时,我需要执行解析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 "";
}
}
有什么想法解决这个问题吗?
谢谢,抱歉我的英语不好
答案 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 "";
}
}