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应用程序恢复不活动时执行一些任务
有没有可能通过 Android Studio 在适用于 Android 的 Windows 子系统上运行 Android 应用程序?