【问题标题】:Android app crashing in onPostExecute() without any errorAndroid 应用程序在 onPostExecute() 中崩溃,没有任何错误
【发布时间】:2018-11-23 02:20:46
【问题描述】:

我正在尝试从可通过此链接访问的 json 文件读取具有注册号、生产者所有者等属性的监视器列表: https://api.myjson.com/bins/dkit2

我用了一个 toast 和 Log.d,我注意到 json 读取工作正常。元素在列表中介绍。唯一不起作用的是 listView 与列表中的元素一起显示。我缺少关于 onPostExecute 和 listView 显示的任何内容吗? 显示消息是“不幸的是,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;

}

}

row_list_item 的 xml:

 <?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>

还有 jsonReading 活动的 xml

    <?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>

【问题讨论】:

  • 您的应用是崩溃了还是什么都不显示?
  • 能否请您发布两个xml文件activity_json_reading.xml和row_list_item.xml的代码
  • 同时添加崩溃日志
  • 显示消息是“不幸的是,Monitor_application 已停止”。我没有任何日志。没有错误堆栈或任何东西。它只是存在并显示该消息

标签: android android-studio listview android-asynctask custom-adapter


【解决方案1】:

我终于明白了。我忘记设置对象的一个​​字段,当 listView 试图显示那个尚未设置且为空的确切字段时,它崩溃了。感谢大家为解决这个问题付出的时间和精力。

【讨论】:

    【解决方案2】:

    一旦尝试在 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()+"");
    }
    

    【讨论】:

    • 这个我也做过,但也不例外。正如我在开始时解释的那样,创建了对象,正确设置了字段,将项目添加到列表中。我有一个用户 AlertDialog.Builder 来显示列表中的项目,除了我需要将它们显示在 listView 中并且不起作用之外,它一切正常
    【解决方案3】:

    在单独的线程上运行 ui 操作可能会出现问题。所有 ui 操作都需要在主线程上运行。试着把它放在你在执行后所做的工作中。

    runOnUiThread(new Runnable() {
      public void run() {
        //Whatever task you wish to perform
      }
    });
    

    【讨论】:

    • 我建议将断点和/或 log.d 放在 postexecute 和适配器中,以准确查看哪一行崩溃了。还要确保从设备/模拟器中清理并删除旧安装,我在这里遇到过布局文件未更新的情况,因此编译版本中不存在导致崩溃的一些引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多