【问题标题】:Android 2.2: ProgressDialog Freezing In Second ThreadAndroid 2.2:ProgressDialog 在第二个线程中冻结
【发布时间】:2010-10-17 11:43:42
【问题描述】:

我最近尝试创建一种在第二个线程中打开 ProgressDialog 的简单方法,因此如果主线程冻结,对话框将继续工作。

这是课程: 公共类 ProgressDialogThread 扩展 Thread { 公共 Looper ThreadLooper; 公共处理程序 mHandler;

公共 ProgressDialog ThreadDialog; 公共上下文对话上下文; 公共字符串对话框标题; 公共字符串对话框消息;

public ProgressDialogThread(Context mContext, String mTitle, String mMessage)
 {
  DialogContext = mContext;
  DialogTitle = mTitle;
  DialogMessage = mMessage;
 }

 public void run()
 {
  Looper.prepare();
  ThreadLooper = Looper.myLooper();

  ThreadDialog = new ProgressDialog(DialogContext);
  ThreadDialog.setTitle(DialogTitle);
  ThreadDialog.setMessage(DialogMessage);
  ThreadDialog.show();

  mHandler = new Handler();

  Looper.loop();
 }

 public void Update(final String mTitle, final String mMessage)
 {
  while(mHandler == null)
   synchronized(this) {
    try { wait(10); } 
    catch (InterruptedException e) {
     Log.d("Exception(ProgressDialogThread.Update)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage());
    }
   }

  mHandler.post(new Runnable(){
   @Override
   public void run() {
    ThreadDialog.setTitle(mTitle);
    ThreadDialog.setMessage(mMessage);
   }});
 }

 public void Dismiss() 
 {
  while(ThreadDialog == null || mHandler == null)
   synchronized(this) {
    try { wait(10); } 
    catch (InterruptedException e) {
     Log.d("Exception(ProgressDialogThread.Dismiss)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage());
    }
   }

  mHandler.post(new Runnable(){
   @Override
   public void run() {
    ThreadDialog.dismiss();
   }});
 }

 public void Continue() 
 {
  while(ThreadLooper == null || mHandler == null)
   synchronized(this) {
    try { wait(10); } 
    catch (InterruptedException e) {
     Log.d("Exception(ProgressDialogThread.Continue)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage());
    }
   }

  mHandler.post(new Runnable(){
   @Override
   public void run() {
    ThreadLooper.quit();
   }});
 }

但有时它可以完美运行,但有时应用程序最终会冻结并崩溃。

这是一个使用示例:

ProgressDialogThread thread = new ProgressDialogThread(this, "Loading", "Please wait...");
thread.start();
// Do Stuff
thread.Dismiss();
thread.Continue();

它有时会产生很多警告甚至崩溃:

例如。 处理程序:向死线程发送消息....

还有例外 ANR 在...... 原因:keyDispatchingTimedOut

感谢您的帮助, 亚历克斯。

【问题讨论】:

    标签: android multithreading progressdialog


    【解决方案1】:

    如果想在 Android 上的单独线程中执行操作,您应该查看 AsyncTask 类。你可以在这里阅读:http://developer.android.com/resources/articles/painless-threading.html

    谷歌搜索(或在 Stack Overflow 上搜索)也会为您提供有关如何使用它的大量信息,上面的链接还不够:)

    【讨论】:

    • 感谢您的回复,但我已经阅读了几次该文章 =P,但是我无法从中得出某种方法来处理需要使用单个解决方案进行线程化的多种情况。我尝试过的其他方法似乎需要大量代码分布在多个文件中。
    • @Alex:我不确定我是否理解你的问题。有关我如何使用 AsyncTask 显示 ProgressDialog 的简单示例,请参阅此链接:pastebin.com/tLDYhtj3(添加了描述正在发生的事情的 cmets)。如果您能解释为什么这在您的情况下不起作用,我们或许可以为您提供进一步的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多