Intereting Posts

Отправить представление как параметр в Asynctask

Я работаю над кодом, в котором я раздуваю представления, когда пользователь нажимает на одно представление, мне нужно выполнить синтаксический анализ URL-адреса, а затем проверить, что синтаксический анализ возвращает меня. Проблема в том, что мне нужно сделать синтаксический анализ, чтобы не получить исключение, и проверить, что я делаю до завершения задачи.

Идеальным было бы отправить представление в качестве параметра в 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 ""; } } 

Любая идея решить эту проблему?

Спасибо и извините за мой плохой английский

Вы можете поместить его в качестве параметра в contructor и сохранить его в объекте 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 ref docs, чтобы узнать, как использовать общие аргументы в определении класса 😉 по адресу http://developer.android.com/reference/android/os/AsyncTask.html.

Если вы хотите отправить View в качестве параметра в AsyncTask , короткий ответ DO NOT !

Взгляды приходят и уходят, и к тому времени, AsyncTask закончилась ваша AsyncTask есть большой шанс, ваш « View уже мертв и ушел, и попытка получить доступ к нему не даст вам ничего, кроме горя и разочарования.

Надлежащим образом обрабатывать данные асинхронно было бы создание отдельного класса обработки данных, который является Observable и включает в себя все AsyncTasks , колокола и свистки. И сделайте свой класс View Observer , который регистрируется для получения обновлений, и просто ждет, пока данные не будут обработаны и предоставлены ему с помощью обратного вызова update() .

Помните, что AsyncTask намеренно сделан для ОТДЕЛЬНОЙ обработки данных из пользовательского интерфейса, совершенно нелогично пытаться связать его.

Вы можете создать конструктор в своей задаче Async, через которую вы можете передать представление и использовать его в своей асинтете, когда это необходимо.

Как ниже

 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 ""; } } 

Попробуй это

  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 ""; } }