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



在我的Android应用中,我有一个使用此代码执行AsyncTask<Void, Void, Void>名为Scan的活动:new Scan().execute();

onPreExecute()方法中,它启动了一个进度对话框,在doInBackground(Void... voids)方法上,它从DynamoDB扫描了一个表,并且在onPostExecute(Void aVoid)方法上,它删除了进度对话框,并使用listview中的DB扫描结果查看自定义BaseAdapter类。

当我打开活动时,一切运行都很好,但是当我按下返回按钮并再次输入活动时,仅执行onPreExecute()onPostExecute(Void aVoid)方法,而doInBackground(Void... voids)未执行,因此仅执行显示并解散了进度对话框,屏幕上没有其他任何内容。

我该如何修复?

代码:

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);
    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()) {
            messagesLv = (ListView) findViewById(R.id.messagesListView);
            messages = new MessagesListAdapter(MinaActivity.this, arrayList);
            messagesLv.setAdapter(messages);
            progressDialog.dismiss();
        } else {
            TextView tv = (TextView) findViewById(R.id.noMessages);
            tv.setVisibility(View.VISIBLE);
            progressDialog.dismiss();
        }
    }
}

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

我所做的是参考SharedPreferences的用户ID并突然起作用。

尝试在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();
        }
    }
}

最新更新