Сбой приложения Android в onPostExecute () без каких-либо ошибок - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь прочитать список мониторов, которые имеют в качестве атрибута регистрационный номер, владельца производителя и т. Д. Из файла json, который доступен по этой ссылке: https://api.myjson.com/bins/dkit2

Я использовал тост, а такжеLog.d и я заметил, что чтение JSON работает просто отлично.Элементы внесены в список.Единственное, что не работает - это отображение listView с элементом из списка.Что-нибудь о onPostExecute и listView diplaying, что мне не хватает?Появится сообщение «К сожалению, приложение Monitor_application остановлено».У меня нет никаких журналов.Нет стека ошибок или чего-то еще.Он просто существует и отображает это сообщение.Я что-то не так делаю в CustomAdapter?

[РЕШЕНИЕ] Я наконец понял это.Я забыл установить одно поле объекта, и когда listView пытался отобразить это точное поле, которое не было установлено и оставлено нулевым, оно зависало.Спасибо всем за потраченное время и усилия на решение этой проблемы.

У меня есть следующие классы:

public class JsonReading extends AppCompatActivity {

public ListView listView;
ArrayList<Monitor> lista=new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_json_reading);


    Worker worker=new Worker();
    worker.execute();

}

public class Worker extends AsyncTask<Void,Void,Void>{

    @Override
    protected  Void doInBackground(Void... voids) {

        HttpURLConnection connection=null;
        InputStream inputStream=null;
        InputStreamReader inputStreamReader=null;
        BufferedReader bufferedReader=null;


        try {
            URL url=new URL("https://api.myjson.com/bins/dkit2");
            connection=(HttpURLConnection)url.openConnection();
            connection.setRequestMethod("GET");

            //connection.connect();
            Log.d("JSON","Se deschide conexiunea");
            inputStream=connection.getInputStream();
            inputStreamReader=new InputStreamReader(inputStream);
            bufferedReader=new BufferedReader(inputStreamReader);

            String line=null;
            StringBuilder builder=new StringBuilder();
            while((line=bufferedReader.readLine())!=null){
                Log.d("JSON",line);
                builder.append(line);
            }
            String entireJson=builder.toString();
            Log.d("JSON",entireJson);
            JSONObject monitors=new JSONObject(entireJson);
            JSONArray listaJson=monitors.getJSONArray("monitors");
            for(int i=0;i<listaJson.length();i++){
                JSONObject elementLista=listaJson.getJSONObject(i);
                Log.d("JSON",elementLista.toString());
                Monitor monitorNou=new Monitor();


                monitorNou.setNr_inventar(Integer.parseInt(elementLista.getString("serviceNumber")));
                monitorNou.setProducator(elementLista.getString("producer"));
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd-mm-yyyy");
                monitorNou.setData_intrarii(simpleDateFormat.parse(elementLista.getString("serviceDate")));
                //diagonal
                monitorNou.setDiagonala(Integer.parseInt(elementLista.getString("diagonal")));
                //tip
                String tip=elementLista.getString(elementLista.getString("tip"));
                if(tip.equals("ALB")){
                    monitorNou.setTipMonitor(EnumTipMonitor.ALB);
                }else{
                    monitorNou.setTipMonitor(EnumTipMonitor.NEGRU);
                }
                //owner
                monitorNou.setProprietar(elementLista.getString("owner"));
                lista.add(monitorNou);

            }


        }catch (MalformedURLException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }finally {
            if(bufferedReader!=null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStreamReader!=null){
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                connection.disconnect();
            }
        }


        return  null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        //afisare in listView
        if(lista!=null){

        //I believe this is the problem since the listView is not displayed
            listView=(ListView)findViewById(R.id.listView_json);
            CustomAdapter adapter=new CustomAdapter(getApplicationContext(),R.layout.row_list_item,lista);
            listView.setAdapter(adapter);
        }
    }
}

}

В своей основной деятельности явызов действия jsonReading следующим образом:

   public void readJson(View view){
        Intent intentJson=new Intent(MainActivity.this,JsonReading.class);
        startActivity(intentJson);
        finish();
  }

Код для CustomAdapter приведен ниже.Я должен упомянуть, что я использую его в другой деятельности, и он прекрасно работает.

public class CustomAdapter extends ArrayAdapter {
TextView mon_nrInreg;
TextView mon_producator;
TextView mon_diagonala;
TextView mon_proprietar;
TextView mon_data;
TextView mon_tip;



public CustomAdapter(Context context, int resource, ArrayList<Monitor> list){
    super(context,resource,list);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    if(convertView==null){
        LayoutInflater layoutInflater=LayoutInflater.from(getContext());
        convertView=LayoutInflater.from(getContext()).inflate(R.layout.row_list_item,null,false);
    }
    Monitor m=(Monitor)getItem(position);
    mon_nrInreg=convertView.findViewById(R.id.tv_nr);

    mon_producator=convertView.findViewById(R.id.tv_prod);
    mon_proprietar=convertView.findViewById(R.id.tv_proprietar);
    mon_diagonala=convertView.findViewById(R.id.tv_diag);
    mon_tip=convertView.findViewById(R.id.tv_tip);
    mon_data=convertView.findViewById(R.id.tv_date);




    mon_nrInreg.setText(Integer.valueOf(m.getNr_inventar()).toString());
    mon_producator.setText(m.getProducator());
    mon_proprietar.setText(m.getProprietar());
    mon_tip.setText(m.getTipMonitor().toString());
    mon_diagonala.setText(Integer.valueOf(m.getDiagonala()).toString());
    mon_data.setText(m.getData_intrarii().toString());


    return convertView;

}

}

XML для row_list_item:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_nr"
        android:layout_width="97dp"
        android:layout_height="61dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:text="numar"

        android:textColor="@android:color/holo_red_dark"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_prod"
        android:layout_width="255dp"
        android:layout_height="61dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:text="producator"
        android:textColor="@android:color/background_dark"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/tv_nr"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_proprietar"
        android:layout_width="232dp"
        android:layout_height="76dp"
        android:textColor="@android:color/background_dark"
        android:layout_marginStart="8dp"
        android:text="proprietar"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_prod" />

    <TextView
        android:id="@+id/tv_tip"
        android:layout_width="120dp"
        android:layout_height="61dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:textColor="@android:color/background_dark"
        android:layout_marginTop="12dp"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/tv_proprietar"
        app:layout_constraintTop_toBottomOf="@+id/tv_prod" />

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="178dp"
        android:layout_height="52dp"
        android:layout_marginBottom="8dp"
        android:textColor="@android:color/background_dark"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_proprietar"
        app:layout_constraintVertical_bias="0.0" />

    <TextView
        android:id="@+id/tv_diag"
        android:layout_width="177dp"
        android:layout_height="52dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        android:textColor="@android:color/background_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toEndOf="@+id/tv_date"
        app:layout_constraintTop_toBottomOf="@+id/tv_tip"
        app:layout_constraintVertical_bias="0.008" />
      </android.support.constraint.ConstraintLayout>

, а такжеXML для JSONReading деятельности

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".JsonReading">

    <ListView
        android:id="@+id/listView_json"

        android:layout_width="368dp"
        android:layout_height="551dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

может быть проблемой с запуском операций пользовательского интерфейса в отдельном потоке.все операции пользовательского интерфейса должны выполняться в главном потоке.Попробуйте поместить это вокруг работы, которую вы делаете в postexecute.

runOnUiThread(new Runnable() {
  public void run() {
    //Whatever task you wish to perform
  }
});
0 голосов
/ 13 июня 2018

Я наконец понял это.Я забыл установить одно поле объекта, и когда listView пытался отобразить это точное поле, которое не было установлено и оставлено нулевым, оно зависало.Спасибо всем за потраченное время и усилия, которые вы пытаетесь решить.

0 голосов
/ 13 июня 2018

один раз попробуйте добавить эти строки в try catch:

mon_nrInreg.setText(Integer.valueOf(m.getNr_inventar()).toString());
mon_diagonala.setText(Integer.valueOf(m.getDiagonala()).toString());

в

try{
mon_nrInreg.setText(Integer.valueOf(m.getNr_inventar()).toString());
mon_diagonala.setText(Integer.valueOf(m.getDiagonala()).toString());
}
catch(Exception e){
Log.e("crash_reason",e.toString()+"");
}
...