我有一个相当复杂的问题。我已经阅读了一些与我的问题类似的帖子,但情况略有不同。
我有一个列表视图的活动。 Activity创建一个具有长时间运行过程的线程。在该过程结束后,它会调用处理程序来更新列表视图并播放声音。如果我在同一个Activity中,它工作正常,但是当进程运行时我点击HOME按钮,然后按快捷键或应用程序图标启动Activity,然后当进程结束时,我听到声音但是列表视图未更新。任何想法为什么会这样?有些人和我也因为方向改变而遇到同样的问题。
// thread created to send the reply.
Thread replyThread = new Thread() {
public void run() {
**Http POST here to upload an image which takes a while.
//Once done, send a msg to handler to play a sound and update listview
Message msg = replyHandler.sendEmptyMessage(0);
}
}
处理程序:
final Handler replyHandler = new Handler() {
public void handleMessage(Message msg) {
fillData();
**Code to play sound.
}
}
fillData()方法
// refresh the listview.
private void fillData() {
// Get all of the rows from the database and create the item list
**I actually have an activity before this one but to simplify the problem I said I have 1 Activity. Bundle is from previous Activity.
String conversationId = "";
Bundle extras = getIntent().getExtras();
if (extras != null) {
conversationId = extras
.getString(TestDbAdapter.KEY_CONVERSATION_ID);
}
if (mDbHelper != null) {
Cursor notesCursor = mDbHelper
.fetchAllMessagesByConversationId(conversationId);
startManagingCursor(notesCursor);
String[] from = new String[] { TestDbAdapter.KEY_BODY,
TestDbAdapter.KEY_TIMESTAMP };
int[] to = new int[] { R.id.text1, R.id.text2 };
// Now create a simple cursor adapter and set it to display
MessagesCursorAdapter notes = new MessagesCursorAdapter(this,
R.layout.messages_row, notesCursor, from, to, mDbHelper);
setListAdapter(notes);
}
}
我知道有些人会说“使用notifyDataSetChanged”,完成了。上面的代码与notifyDataSetChanged的工作方式相同,但可能不是非常优雅,但在我的情况下它可以工作,但它对我使用notifyDataSetChanged的问题没有帮助。
答案 0 :(得分:0)
按下主页按钮并重新启动活动后,将创建“新”活动。
来自长时间运行流程的回调将被发送到旧活动,而不是新活动。
方向更改也会发生类似情况,每次方向更改都会创建一个新活动(不会收到回调)。
我知道有几种方法可以解决这个问题: