父活动未看到的子活动数据库更新

时间:2018-04-22 22:32:50

标签: android sqlite android-activity background

我有一个活动,其中包含客户订单的列表/适配器视图以及用于添加新订单的第二个活动。当销毁添加订单活动时,我将订单保存到SQLLite数据库并返回显示客户订单的活动。

但刚刚添加的订单不在列表中!!

我尝试过StartActivityForResult,但这似乎不起作用。

我试图将list / adapter刷新放在onActivityResume,onResume,onRestart上,但是刚添加的顺序仍然不在列表中。

我不想将订单保存与活动结束分开,因为这与用户体验不符。

我在调用添加订单活动之前已经保存了订单数量,然后在调用addOrder活动之前等待订单数量大于订单数量,但这不能很好地流动。

我的问题是如何最好地处理这种情况,就像用户体验所添加的订单需要在订单列表中一样。

我有另一个活动,可以删除订单,当返回到父订单时,订单将从数据库中删除,因此不会在列表中删除。我认为这是因为删除比插入??

更快

- >更新2018/04/25

感谢您的评论。我已经做了一个代码示例来解释这个问题,并且这样做现在可以更好地理解执行流程以及我遇到问题的原因。

下面是调用活动B的活动A的代码。

public class AActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    Intent activityB = new Intent(this, BActivity.class   );
    startActivityForResult(activityB,2);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    debug("Resfreshing list from database");
    debug("onActivityResult with result code "+resultCode);
}

void debug(String inmes){Log.e("Activity A:",inmes);}
}

public class BActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    ConstraintLayout cL=findViewById(R.id.cl);
    cL.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            debug("onTouch: going to return 7");
            Intent i = new Intent();
            setResult(7, i);
            finish();
            return false;
        }
    });
}

@Override
public void onDestroy(){
    super.onDestroy();
    debug("Inserting record into database");
    debug("onDestroy: going to return 12");
    Intent i = new Intent();
    setResult(12, i);
}

void debug(String inmes){
    Log.e("Activity B:",inmes);}
}

下面的控制台输出解释了我的问题是什么,因为当我点击后退按钮0被返回时,此时我从数据库刷新了我的列表,但由于onDestroy尚未执行,记录还没有已创建。

Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 0.
Activity B:: Inserting record into database.
Activity B:: onDestroy: going to return 12.

同样与TouchListner相同(显然): -

Activity B:: onTouch: going to return 7.
Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 7.
Activity B:: Inserting record into database.
Activity B:: onDestroy: going to return 12.

结论和解决方案是覆盖onBackPressed以进行数据库更新。 以下是更新后的活动B;

public class BActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    ConstraintLayout cL=findViewById(R.id.cl);
    cL.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            debug("onTouch: going to return 7");
            Intent i = new Intent();
            setResult(7, i);
            finish();
            return false;
        }
    });
}


@Override
public void onBackPressed(){
    debug("Inserting record into database");
    debug("onBackPressed: going to return 38");
    Intent i = new Intent();
    setResult(38, i);
    super.onBackPressed();;
}

@Override
public void onDestroy(){
    super.onDestroy();
    debug("onDestroy: going to return 12");
    Intent i = new Intent();
    setResult(12, i);
}

void debug(String inmes){
    Log.e("Activity B:",inmes);}

}

控制台输出,现在将记录插入数据库,然后将焦点移回活动A: -

Activity B:: Inserting record into database.
Activity B:: onBackPressed: going to return 38.
Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 38.
Activity B:: onDestroy: going to return 12.

我现在知道onDestroy是一个后台事件,不应该用于与应用程序交互流程相关的任何内容。

1 个答案:

答案 0 :(得分:0)

试试这个,当你在第二个活动中添加订单后回来时,它会刷新你的第一个活动。 使用StartActivityForResult调用第二个活动,并在第一个活动中添加此代码。

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Intent i = new Intent(Activity1.this, Activity1.class);
    startActivity(i);

}

在完成或销毁第二项活动之前,请添加以下行

    Intent i = new Intent();
    setResult(2, i);
    this.finish();