Android:ProgressDialog的问题
亲爱的安卓黑客:, 我尝试在我的Android应用程序中执行以下操作:当用户单击ListActivity中的列表项时,应显示一个ProgressDialog,应进行一些预加载,完成后,应使用intent调用另一个活动 我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是原始活动的成员,我无法在异步任务之外显示、取消或编辑ProgressDialog 然后我切换到一个简单的线程,这就是我尝试的方式:Android:ProgressDialog的问题,android,multithreading,Android,Multithreading,亲爱的安卓黑客:, 我尝试在我的Android应用程序中执行以下操作:当用户单击ListActivity中的列表项时,应显示一个ProgressDialog,应进行一些预加载,完成后,应使用intent调用另一个活动 我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是原始活动的成员,我无法在异步任务之外显示、取消或编辑ProgressDialog 然后我切换到一个简单的线程,这就是我尝试的方式: dialog = ProgressDialog.show(BookmarkActi
dialog = ProgressDialog.show(BookmarkActivity.this, "", "Loading...",true);
new Thread() {
public void run() {
// do something
dialog.setMessage("Change Message...");
// do more
dialog.dismiss();
// ...
Intent intent = new Intent(BookmarkActivity.this, ThreadActivity.class);
BookmarkActivity.this.startActivity(intent);
}
}.start();
这几乎可以工作,但对话框消息的更改却不能。我在说“漏窗”时出错了。(如果需要,我可以发布完整的日志)
我的问题是:
- 在类有自己的文件的情况下,如何使用异步任务
- 如何在我的线程或异步任务中更改ProgressDialog,而不导致在另一个线程中更改UI时出错
好的,在Jason的帮助下,我完成了这个异步任务有效强>
public class ThreadPreLoader extends AsyncTask<Object, String, Void> {
private Activity mActivity;
private ProgressDialog mDialog;
public ThreadPreLoader(Activity activity) {
mActivity = activity;
}
protected void onPreExecute() {
mDialog = new ProgressDialog(mActivity);
mDialog.setMessage("Loading...");
mDialog.show();
}
protected Void doInBackground(Object... args) {
publishProgress("Loading something else..");
return null;
}
protected void onProgressUpdate(String... msg) {
mDialog.setMessage(msg[0]);
}
protected void onPostExecute(Void result) {
mDialog.dismiss();
}
}
公共类线程预加载程序扩展异步任务{
私人活动能力;
私人住宅;
公共线程预加载程序(活动){
活动性=活动性;
}
受保护的void onPreExecute(){
mDialog=新进度对话框(mActivity);
mDialog.setMessage(“加载…”);
mDialog.show();
}
受保护的Void doInBackground(对象…args){
publishProgress(“加载其他内容”);
返回null;
}
受保护的void onProgressUpdate(字符串…msg){
mDialog.setMessage(消息[0]);
}
受保护的void onPostExecute(void结果){
mDialog.discouse();
}
}
再次感谢,Jason。您应该使用
异步任务
,定义一个自定义异步任务
,该任务接收原始活动的上下文(此
)。
然后保留该上下文,以便以后取消该对话框。
通过doInBackground()
方法,您可以调用postProgress(int-progress)
,这将导致在异步任务中调用onProgressUpdate()
,此方法位于UI线程上,因此不会导致跨线程错误。
一旦doInBackground()
完成,UI线程上也将调用方法onComplete()
,在这里您可以使用保存的上下文并取消对话框(context.dismissdialog()
看看Android的类。如果在活动的onCreate
方法中创建处理程序,则发送到处理程序的post
方法的可运行文件将在活动的UI线程上运行:
Handler h;
protected void onCreate(Bundle bundle) {
h = new Handler;
new Thread() {
public void run() {
// your run code
h.post(new Runnable() { /* change dialog here */ });
}
}.start();
}
我不确定这是不是最好的选择,但值得一试。在AsyncTask中
您应该在后台做需要时间的工作,并像调用意图一样,在这个任务应该在onPostExecute中完成之后需要做的事情
public class ThreadPreLoader extends AsyncTask<Object, String, Void> {
private Activity mActivity;
private ProgressDialog mDialog;
public ThreadPreLoader(Activity activity) {
mActivity = activity;
}
protected void onPreExecute() {
mDialog = new ProgressDialog(mActivity);
mDialog.setMessage("Loading...");
mDialog.show();
}
protected Void doInBackground(Object... args) {
//do more
publishProgress("Loading something and reached somewhere..");
//do more
publishProgress("Loading something and reached somewhere..");
//do more
return null;
}
protected void onProgressUpdate(String msg) {
mDialog.setMessage(msg);
}
protected void onPostExecute() {
Intent intent = new Intent(BookmarkActivity.this, ThreadActivity.class);
BookmarkActivity.this.startActivity(intent);
mDialog.dismiss();
}
}
公共类线程预加载程序扩展异步任务{
私人活动能力;
私人住宅;
公共线程预加载程序(活动){
活动性=活动性;
}
受保护的void onPreExecute(){
mDialog=新进度对话框(mActivity);
mDialog.setMessage(“加载…”);
mDialog.show();
}
受保护的Void doInBackground(对象…args){
//多做
publishProgress(“加载某物并到达某处…”);
//多做
publishProgress(“加载某物并到达某处…”);
//多做
返回null;
}
受保护的void onProgressUpdate(字符串msg){
mDialog.setMessage(msg);
}
受保护的void onPostExecute(){
意向意向=新意向(BookmarkActivity.this、ThreadActivity.class);
BookmarkActivity.this.startActivity(intent);
mDialog.discouse();
}
}
嘿,杰森,这听起来很有希望。我将尝试实现这一点,稍后给出反馈!我更新了我的第一篇帖子,实现了你的想法。它没有发挥应有的作用。你能看看代码吗?现在可以了,在AsynTask的实现中有一些小错误。再次感谢。嘿,Matthias,你说得对,我可以使用我现在正在尝试,但是异步任务会更有用。