我有一些活动。在主活动中,我有一个登录屏幕,当用户按下登录按钮时,启动一个线程以显示进度对话框,直到用户通过身份验证。此时我加载下一个活动,该活动有几个字段供用户输入数据。
这里用户输入一些数据并按下按钮来处理它。数据将传递到实际处理和显示数据的新活动。这是我创建新线程的地方以及当我调用thread.start()时它崩溃的地方;我不知道为什么会这样。
这两项活动都在实施Runnable。
我使用下面相同的代码在第一个活动的按钮按下和最后一个活动的onCreate方法中创建并调用thread.start():
pd = ProgressDialog.show(search_results.this, "", "Searching...", true, false);
Thread thread = new Thread(this);
thread.start();
我也使用下面相同的代码来处理两者的线程。
public void run() {
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
pd.dismiss();
}
};
我错过了什么吗?我真的不明白为什么会崩溃。
答案 0 :(得分:5)
虽然我鼓励人们使用AsyncTask
,但实际上并不需要 ,尤其是对于简单的事情,例如进度/加载对话框。那里的不是问题。
您的问题和代码令人困惑。我不确定哪些代码在哪里进行,在哪些活动上,我希望你不要在活动之间打开对话框,试图在它们之间访问它们(当然它不会起作用)。此外,向Context
提供Thread
甚至无法编译(在设计时标记为错误)。总而言之,您没有提供日志条目。对不起,我无法理解你在做什么或错误在哪里。我们只能猜测。
以下是使用Handler
,Runnable
和Thread
执行此操作的可能方法之一。当我第一次学习如何使用它时,这是从Developer Resource获取的:
1-您宣布Handler
。大多数人在onCreate
部分执行此操作以经常重复使用它:
Handler mHandler = new Handler();
2-如果需要,可以开始Thread
:
new Thread() { public void run() {
mHandler.post(mLoadingData);
// ... do work
mHandler.post(mLoadingDataStop);
}}.start()
3-这些是发布到Runnable
的{{1}}:
Handler
对于进度对话框,事情需要更多工作(更新进度等),但对于加载对话框,您不需要真正搞乱消息。
答案 1 :(得分:0)
在为平板电脑开发时,我遇到了同样的问题。在某个API之后,我想3.0(sdk 11),Android强制应用程序在单独的线程上运行长时间运行的进程,否则它会杀死它。 Logcat将确认这一点。
我知道你正在使用另一个帖子,但这对我也不起作用。尝试使用AsyncTask。你可以创建一个快速的内部类,在我看来,它比处理你自己的线程更容易。 AsyncTask有几个在UI线程上运行的函数和一对在自己的线程上运行的函数。这允许您在用户界面线程上启动“加载”用户界面对象,在后端线程上进行处理,然后在完成后,它将通知用户界面线程函数。
您需要专门查看覆盖
onPreExecute() doInBackground() onPostExecute()