使用android中的可序列化将对象从第二个活动传递回主要活动

Posted

技术标签:

【中文标题】使用android中的可序列化将对象从第二个活动传递回主要活动【英文标题】:Passing an object from the 2nd activity back to main activity using serializable in android 【发布时间】:2018-08-18 03:41:11 【问题描述】:

下面的第一个代码块是我的主要活动,我在其中创建了第二个活动的意图。在这个活动中,我在一个列表视图中显示了费用,由于它没有完全实现,所以现在我已经忽略了。我想做的是启动第二个活动,让用户输入详细信息并按下按钮将活动添加到列表视图。 @覆盖 public boolean onOptionsItemSelected(MenuItem item) int id = item.getItemId();

        if (id == R.id.addExpense) 
            Intent intent = new Intent(this, ExpenseActivity.class);
            startActivityForResult(intent, 1);
            return true;
        
        return super.onOptionsItemSelected(item);
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    // check that it is the SecondActivity with an OK result
    if (requestCode == 1) 
        if (resultCode == RESULT_OK) 
            Expense expense = (Expense) data.getSerializableExtra("sampleObject");
            Expenses.add(expense);
        
    



 final Button btnAddExpense = (Button) findViewById(R.id.btnAddExpense);
    btnAddExpense.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
           String amountV = txtAmountVat.getText().toString();
           int amountVTwo = Integer.parseInt(amountV);
           String amountI = txtAmount.getText().toString();
           int amountITwo = Integer.parseInt(amountI);

            Expense expense = new Expense(amountITwo, amountVTwo, txtDateOfExpense.getText().toString(), txtDateAdded.getText().toString(), datePaid, paid, txtDes.getText().toString(), imageUri );

            Intent intent = new Intent();
            intent.putExtra("Expense", expense);
            setResult(MainActivity.RESULT_OK, intent);
            finish();
        
        );

这是我的第二个用户输入数据的活动。当我尝试传回费用对象时,模拟器状态应用程序已停止工作。请给我一些帮助,因为我不知道是什么导致了这个问题。这就是我的班级的样子。

public class Expense implements Serializable 

private int _amount, _amountVat;
private String _dateOfExpense, _dateAdded, _datePaid, _expenseDescription;
private Boolean _paid;
private Uri _imageUri;

public Expense(int amount, int amountVat, String dateOfExpense, String dateAdded, String datePaid, Boolean paid, String expenseDescription, Uri imageUri)

    _amount = amount;
    _amountVat = amountVat;
    _dateOfExpense = dateOfExpense;
    _dateAdded = dateAdded;
    _datePaid = datePaid;
    _paid = paid;
    _expenseDescription = expenseDescription;
    _imageUri = imageUri;


public int get_amount() 
    return _amount;


public void set_amount(int _amount) 
    this._amount = _amount;


public int get_amountVat() 
    return _amountVat;


public void set_amountVat(int _amountVat) 
    this._amountVat = _amountVat;


public String get_dateOfExpense() 
    return _dateOfExpense;


public void set_dateOfExpense(String _dateOfExpense) 
    this._dateOfExpense = _dateOfExpense;


public String get_dateAdded() 
    return _dateAdded;


public void set_dateAdded(String _dateAdded) 
    this._dateAdded = _dateAdded;


public String get_datePaid() 
    return _datePaid;


public void set_datePaid(String _datePaid) 
    this._datePaid = _datePaid;


public Boolean get_paid() 
    return _paid;


public void set_paid(Boolean _paid) 
    this._paid = _paid;


public Uri get_imageUri() 
    return _imageUri;


public void set_imageUri(Uri _imageUri) 
    this._imageUri = _imageUri;


public String get_expenseDescription() return _expenseDescription;

public void set_expenseDescription(String _expenseDescription) this._expenseDescription = _expenseDescription;

【问题讨论】:

对不起,主要活动的第一位代码不是代码格式。 您在日志中遇到什么错误? 除了关于这些 12:22 模拟器的错误之外,似乎什么都没有:coreaudio:无法为 audioOutputDeviceIOProc 锁定语音 12:22 模拟器:原因:参数无效 在实现意图之前我遇到了这些错误 您需要通过调用日志来调试您的代码,以查看您正在获取的数据以及应用程序在崩溃之前达到的状态,或者可能设置断点。 【参考方案1】:

如果没有适当的日志详细信息,您的问题就无从谈起。 但是你可以通过这些点。 Serializable 方法的问题在于使用了反射,而且这是一个缓慢的过程。这种方法会创建很多临时对象并导致相当多的垃圾收集。所以,可能是因为这个。尝试在真实设备上运行并查看它是否仍然存在。 或者,您可以为您的类实现 Parcelable,它比 Serializable 更快。

【讨论】:

我已经调试好了。正在抛出此错误。 java.lang.RuntimeException: Parcelable 在写入可序列化对象时遇到 IOException。有一堆与此相关的。对不起,我是安卓新手。我应该复制所有错误吗? 我考虑过实现 Parcelable。我只是在我的课堂上找不到如何读写图像 要使用 Parcelable,只需在模型类中实现它,并实现它的所有方法。这很简单。并且,请检查您是否在模型类的所有类和子类中实现了 Serializable。它一定是抛出异常,因为您没有在所有内部类中实现 Serializable。 谢谢你,我用parcelable让它通过了

以上是关于使用android中的可序列化将对象从第二个活动传递回主要活动的主要内容,如果未能解决你的问题,请参考以下文章

从第二个活动返回时,在 AsyncTask 调用后保存 RecyclerView 状态

如何更改从第一个活动单击的按钮上的第二个活动的文本? [科特林]

从第二个活动调用 sendMessage 方法

将选定对象传递给第二个视图控制器并在 uilabel 中显示

Android 共享元素转换:将 ImageView 从圆形转换为矩形,然后再转换回来

intent传对象为啥要序列化