La tarea asincrona nunca termina de ejecutarse

Es mi primera vez explicando un problema de programación en un foro de tanto prestigio, así que,pido perdón si mi pregunta y explicación no es correcta pero necesito ayuda y no consigo encontrar una solución.

Estoy desarrollando una app para Android sobre un puzzle, el caso es que cada vez que un jugador juega debe poner un nombre y éste se escribe en una base de datos remota. El problema lo tengo cuando al darle a la opción de listar tiempos(que es listar jugadores) me ejecuta correctamente la query a la base de datos pero la tarea asíncrona nunca termina y no sigue ejecutándose.

Para ser mas exactos, la barra de ProgressDialog nunca se quita incluso al haber llegado al método OnPostExecute, aunque las tareas del BackGround terminaron.

He intentado terminar la tarea a la fuerza pero no hace nada y estoy seguro que realiza las operaciones porque tengo mensajes de Log por todo el código y me va mostrando lo que se esta ejecutando.

Aquí dejo el código:

FRAGMENT PRINCIPAL

public class FragmentListaJugadores extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public FragmentListaJugadores() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment FragmentListaJugadores.
 */
// TODO: Rename and change types and number of parameters
public static FragmentListaJugadores newInstance(String param1, String param2) {
    FragmentListaJugadores fragment = new FragmentListaJugadores();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

public static final String UPLOAD_URL = "http://158.49.96.138/josecarlos/selectJugadores.php";
ArrayList<Jugador> jugadores;
ListAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_lista_jugadores, container, false);
    ListView lista = (ListView) view.findViewById(R.id.listSelect);
    jugadores = new ArrayList<Jugador>();
    adapter = new ListAdapter(getActivity(), R.layout.list_jugador, jugadores);
    lista.setAdapter(adapter);

    return inflater.inflate(R.layout.fragment_lista_jugadores, container, false);
}
//METODO CON EL QUE EJECUTO LA TAREA ASINCRONA
public void onStart(){
    super.onStart();
    SeleccionarJugador sj=new SeleccionarJugador();
    sj.execute();
}


    //TAREA ASINCRONA 
    class SeleccionarJugador extends AsyncTask<Void, Void, String> {

        ProgressDialog loading;
        String result = new String();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(getActivity(), "Obteniendo datos...", "Por favor Espere...", true, true);
        }

        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();

        }

        @Override
        protected String doInBackground(Void... params) {
            Log.i("INF", "LLega al background");
            selectJug();//LLAMO A UN METODO EXTERNO DONDE REALIZO LA CONEXION

            return result;
        }
    }

 //METODO QUE CONECTA CON LA BBDD Y RECOGE LOS DATOS CON UN JSON
public void selectJug(){
    URL url;
    String result = "";
    try {
        url = new URL(UPLOAD_URL);

        Log.i("INF","LLega a send url "+UPLOAD_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(150000);
        conn.setConnectTimeout(150000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);

        InputStream os = conn.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(os));


        String line;

        while ((line = reader.readLine()) != null) {
            result+=line+"\n";
        }
        Log.i("INF", "result es " + result);//ME ASEGURO QUE SE HAN COGIDO CORRECTAMENTE
        os.close();
        conn.disconnect();//UNA VEZ COGIDOS LOS DATOS CIERRO LA CONEXION
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        Log.i("json","Salio de consulta");
        result=result.substring(result.indexOf("["));
        JSONArray jArray = new JSONArray(result.toString());
        for (int i = 0; i < jArray.length(); i++) {
            JSONObject json_data = jArray.getJSONObject(i);
            Log.i("INF", "id " + json_data.getString("Id") + " nombre " + json_data.getString("Nombre") + " mov " + json_data.getString("Movimientos") + " tiempo " + json_data.getString("Tiempo"));//ME ASEGURO QUE NO SE PIERDEN LOS DATOS DESPUES DE LA CONEXION
            Jugador p = new Jugador();
            p.setId(json_data.getInt("Id"));
            p.setNombre(json_data.getString("Nombre"));
            p.setMov(json_data.getString("Movimientos"));
            p.setTiempo(json_data.getString("Tiempo"));
            jugadores.add(p);//AÑADO LO JUGADORES A UNA LISTA PARA MOSTRARLOS
        }
    } catch (Exception e) {
        Log.e("ERROR", "Error pasting data " + e.toString());
    }
}

}

ADAPTADOR DE LA LISTA

 public class ListAdapter extends ArrayAdapter<Jugador>{
 int groupid;
 ArrayList<Jugador> records;
Context context;

public ListAdapter(Context context, int vg, ArrayList<Jugador>records) {
    super(context,vg,records);
    this.context = context;
    groupid = vg;
    this.records = records;
}



public View getView(int position, View convertView, ViewGroup parent) {
    Log.i("INF","ha entrado en listAdapter");
    View row=convertView;
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(groupid, parent, false);
        TextView textName = (TextView) row.findViewById(R.id.pro_nombre);
        textName.setText(records.get(position).getNombre());
        TextView textMov = (TextView) row.findViewById(R.id.pro_mov);
        textMov.setText(records.get(position).getMov());
        TextView textTiempo = (TextView) row.findViewById(R.id.pro_tiempo);
        textTiempo.setText(records.get(position).getTiempo());
    }
    return row;
}
}

LAYOUT DEL FRAGMENT DE LISTA

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.josecarlos.puzzlepractica.FragmentListaJugadores">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listSelect"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="50dp" />
</RelativeLayout>

</FrameLayout>

LAYOUT DEL ADAPTADOR

 <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp" >

<TextView
    android:id="@+id/pro_nombre"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginRight="10dp"
    android:textSize="20sp"
    android:text="nombre" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:id="@+id/pro_mov"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:text="movimientos" />

<TextView
    android:id="@+id/pro_tiempo"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:textSize="20sp"
    android:layout_alignParentRight="true"
    android:text="tiempo" />


</RelativeLayout>

Espero que me haya explicado correctamente y que me puedan ayudar con mi problema.

4
задан 28.12.2016, 02:24
2 ответа

в классе SeleccionarJugador в методе onPostExecute

@Override
protected void onPostExecute(String s)
{
    super.onPostExecute(s);
    try
    {
        sj.finalize(); //agrega esto 
        loading.dismiss();

    }
    catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}

Должен оставаться немного сходным, надеялся помочь тебе

1
ответ дан 24.11.2019, 11:51

Попробуй создавать переменную ProgressDialog loading; на уровне главного класса

и в método onPostExecute помести

loading.hide(); 

вместо loading.dismmis();

0
ответ дан 24.11.2019, 11:51
  • 1
    Привет @ser3739319. Желанный в Стакк Оверфлов в espaГ±ol . ¿ Podrí схвати объяснять с немного má s детали có mo дело в том, что это solucionarí в проблему вопроса? – Mariano 06.03.2017, 20:10
  • 2
    Он бы это решил, потому что одна из проблем, которые у него были, состояла в том, что не закрывалось окно progressDialog, и сделав loading.dismmis () или loading.hide (), если он закрывался, чтобы заканчивать задание. Другая проблема, которая у него была, состояла в том, что сам fragment не показывал хорошо данных из-за ошибки programació n, чтобы отображать их поэтому, казалось, что он давал ошибку, асинхронное задание. – JoseCa 18495 19.03.2017, 13:52

Теги

Похожие вопросы