重新打开活动时,AsyncTask中的doInBackground()方法不起作用

时间:2017-12-01 11:19:29

标签: android android-asynctask amazon-dynamodb

在我的Android应用中,我有一个活动,使用以下代码AsyncTask<Void, Void, Void>执行名为Scan的{​​{1}}。

new Scan().execute();方法中,它启动一个进度对话框,在它从DynamoDB扫描表的onPreExecute()方法上,在doInBackground(Void... voids)方法上,它取消了进度对话框,并且使用自定义onPostExecute(Void aVoid)类在ListView中查看数据库扫描的结果。

当我打开活动时,一切都运行良好,但当我按下后退按钮并再次输入活动时,只有BaseAdapteronPreExecute()方法正在执行,而{{{ 1}}没有被执行,因此它只显示和取消进度对话框,屏幕上没有其他内容被查看。

我该如何解决这个问题?

代码:

onPostExecute(Void aVoid)

2 个答案:

答案 0 :(得分:0)

无法找到任何消息的原因是我检查了消息的用户ID是否等于注册用户的用户ID。问题是它是从MainActivity.java获取的,它是从Intent额外获得的,因此,当我离开活动时,变量已被删除。

我所做的是引用SharedPreferences中的用户ID,然后突然发挥作用。

答案 1 :(得分:-1)

尝试在onPostExecute()方法中添加messages.notifyDataSetChanged();

使用以下代码

    MessagesListAdapter messages;
ListView messagesLv;
public static ArrayList<Message> arrayList;
public static ProgressDialog progressDialog;

public static DynamoDBScanExpression dbScanExpression;
public static List<Message> messageList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_messages);
    messagesLv = (ListView) findViewById(R.id.messagesListView);
            messages = new MessagesListAdapter(MinaActivity.this, arrayList);
            messagesLv.setAdapter(messages);
    new Scan().execute();
}

private class Scan extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progressDialog = new ProgressDialog(TestActivity.this);
        progressDialog.setTitle(name);
        progressDialog.setMessage("Searching for messages...");
        progressDialog.setIndeterminate(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        dbScanExpression = new DynamoDBScanExpression();

        Condition condition = new Condition()
                .withComparisonOperator(ComparisonOperator.EQ)
                .withAttributeValueList(new AttributeValue().withS(MainActivity.msgId));
        dbScanExpression.addFilterCondition("msgId", condition);

        messageList = MainActivity.mapper.scan(Message.class, dbScanExpression);
        arrayList = new ArrayList<Message>();
        for (Message msg : messageList) {
            if (msg.getUserId() == null || msg.getUserId().equals(MainActivity.userId)) {
                msg.setMsgId(msg.getMsgId());
                msg.setDate(msg.getDate());
                msg.setTime(msg.getTime());
                msg.setMessage(msg.getMessage());
                msg.setUserId(msg.getUserId());
                arrayList.add(msg);
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        if (!messageList.isEmpty()) {
           messages.notifyDataSetChanged();

            progressDialog.dismiss();
        } else {
            TextView tv = (TextView) findViewById(R.id.noMessages);
            tv.setVisibility(View.VISIBLE);

            progressDialog.dismiss();
        }
    }
}