Android AsyncTask中的doInBackground()方法不';当活动重新打开时,无法工作
在我的Android应用程序中,我有一个活动,它使用以下代码执行名为Android AsyncTask中的doInBackground()方法不';当活动重新打开时,无法工作,android,android-asynctask,amazon-dynamodb,Android,Android Asynctask,Amazon Dynamodb,在我的Android应用程序中,我有一个活动,它使用以下代码执行名为Scan的AsyncTask任务:new Scan().execute() 在onPreExecute()方法中,它启动一个进度对话框;在doInBackground(Void…voids)方法中,它从DynamoDB扫描一个表;在onpostsecute(Void aVoid)方法中,它取消进度对话框,并使用自定义的BaseAdapter类在列表视图中查看数据库扫描的结果 当我打开活动时,一切都运行得很好,但是当我按下后退按钮
Scan
的AsyncTask
任务:new Scan().execute()代码>
在onPreExecute()
方法中,它启动一个进度对话框;在doInBackground(Void…voids)
方法中,它从DynamoDB扫描一个表;在onpostsecute(Void aVoid)
方法中,它取消进度对话框,并使用自定义的BaseAdapter
类在列表视图中查看数据库扫描的结果
当我打开活动时,一切都运行得很好,但是当我按下后退按钮并再次输入活动时,只有onPreExecute()
和onPostExecute(Void aVoid)
方法正在执行,而doInBackground(Void…voids)
没有执行,因此,它只是显示和取消进度对话框,而屏幕上没有看到其他内容
我怎样才能解决这个问题
代码:
MessagesListAdapter消息;
ListView消息SLV;
公共静态ArrayList ArrayList;
公共静态进程对话框;
公共静态发电机BSCANExpression dbScanExpression;
公共静态列表消息列表;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_消息);
新扫描().execute();
}
私有类扫描扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(TestActivity.this);
progressDialog.setTitle(名称);
设置消息(“搜索消息…”);
progressDialog.setUndeterminate(false);
progressDialog.show();
}
@凌驾
受保护的空位背景(空位…空位){
dbScanExpression=新的DynamoDBScanExpression();
条件条件=新条件()
.带ComparisonOperator(ComparisonOperator.EQ)
.WithAttributeValue列表(新的AttributeValue().With(MainActivity.msgId));
dbScanExpression.addFilterCondition(“msgId”,条件);
messageList=MainActivity.mapper.scan(Message.class,dbScanExpression);
arrayList=新的arrayList();
用于(消息消息消息:消息列表){
如果(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);
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
如果(!messageList.isEmpty()){
messagesLv=(列表视图)findViewById(R.id.messagesListView);
messages=newmessagesListAdapter(MinaActivity.this,arrayList);
messagesLv.setAdapter(消息);
progressDialog.disclose();
}否则{
TextView tv=(TextView)findViewById(R.id.noMessages);
tv.setVisibility(View.VISIBLE);
progressDialog.disclose();
}
}
}
尝试添加消息。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();
}
}
}
MessagesListAdapter消息;
ListView消息SLV;
公共静态ArrayList ArrayList;
公共静态进程对话框;
公共静态发电机BSCANExpression dbScanExpression;
公共静态列表消息列表;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_消息);
messagesLv=(列表视图)findViewById(R.id.messagesListView);
messages=newmessagesListAdapter(MinaActivity.this,arrayList);
messagesLv.setAdapter(消息);
新扫描().execute();
}
私有类扫描扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(TestActivity.this);
progressDialog.setTitle(名称);
设置消息(“搜索消息…”);
progressDialog.setUndeterminate(false);
progressDialog.show();
}
@凌驾
受保护的空位背景(空位…空位){
dbScanExpression=新的DynamoDBScanExpression();
条件条件=新条件()
.带ComparisonOperator(ComparisonOperator.EQ)
.WithAttributeValue列表(新的AttributeValue().With(MainActivity.msgId));
dbScanExpression.addFilterCondition(“msgId”,条件);
messageList=MainActivity.mapper.scan(Message.class,dbScanExpression);
arrayList=新的arrayList();
用于(消息消息消息:消息列表){
如果(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);
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
如果(!messageList.isEmpty()){
messages.notifyDataSetChanged();
progressDialog.disclose();
}否则{
TextView tv=(TextView)findViewById(R.id.noMessages);
tv.setVisibility(View.VISIBLE);
progressDialog.disclose();
}
}
}
它找不到任何消息的原因是,我检查了消息的用户ID是否等于注册用户的用户ID。问题是它来自M
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();
}
}
}