Android 应用程序在 onPostExecute() 中崩溃,没有任何错误

Posted

技术标签:

【中文标题】Android 应用程序在 onPostExecute() 中崩溃,没有任何错误【英文标题】:Android app crashing in onPostExecute() without any error 【发布时间】: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_
    android:layout_>

    <TextView
        android:id="@+id/tv_nr"
        android:layout_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
    android:layout_
    tools:context=".JsonReading">

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

        android:layout_
        android:layout_
        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 已停止”。我没有任何日志。没有错误堆栈或任何东西。它只是存在并显示该消息 【参考方案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 和适配器中,以准确查看哪一行崩溃了。还要确保从设备/模拟器中清理并删除旧安装,我在这里遇到过布局文件未更新的情况,因此编译版本中不存在导致崩溃的一些引用。

以上是关于Android 应用程序在 onPostExecute() 中崩溃,没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

Android - 在 Android 1.6 中开发的应用程序可以在 Android 2.0 中运行吗?

当android应用程序后台运行时如何在android中隐藏视图(在后台运行时不停止android拍摄快照)[重复]

Android :: 需要在android应用程序恢复不活动时执行一些任务

如何在 Chrome 上安装 Android 应用

有没有可能通过 Android Studio 在适用于 Android 的 Windows 子系统上运行 Android 应用程序?

如何在 Android 应用程序中使用自定义主题