2011-08-26 108 views
0

我试图在非活动类中显示一个对话框。基本上,我在我的应用程序中检测到一个对象,我想显示一个对话框然后切换活动。我得到一个“java.lang.RuntimeException:不能在我的logcat中没有调用Looper.prepare()”的线程内创建处理程序。在非活动类中显示progressdialog

下面是我的一些代码:

public ImageTargetsRenderer(Context context) { 
    this.context = context; 
    mDialog = new ProgressDialog(context); 
    } 

public void onDrawFrame(GL10 gl) { 
    testFlag = 0; 

    // DO NOT RENDER IF THERE IS NO TRACKABLE 
    if (!mIsActive) 
     return; 

    // Call our native function to render content 
    // RENDER IF THERE IS A TRACKABLE 
    testFlag = renderFrame(); 

    System.err.println("ImageTargetsRenderer reports: " + testFlag); 

    if(testFlag > 0 && frameCount > 5) 
    { 
     frameCount = 0; 
     System.err.println("Starting to switch activities."); 

     mDialog.setTitle("Please wait"); 
     mDialog.setMessage("Please wait"); 
     mDialog.show(); 

     new Thread() { 
      public void run() { 
         try{ 
          sleep(5000); 
         } catch (Exception e) { } 
       // Dismiss the Dialog 
       mDialog.dismiss(); 
      } 
     }.start(); 


     Intent myIntent = new Intent(context, FlashActivity.class); 
     myIntent.putExtra("com.qualcomm.QCARSamples.ImageTargets.flagTest", testFlag); 
     myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     context.startActivity(myIntent); 
     testFlag = 0; 

     return; 
    } 
    frameCount++; 


} 
+0

添加我的编辑后更新有问题的代码.. – Ronnie

回答

3

你的对话框应该从UIthread被调用,所以尝试使用这个,

context.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       mDialog.show(); 

      } 
     }); 

希望这工作。

+0

我得到了一个“上下文不能被解析为一个类型”的错误:( – ffrstar777

+1

你在这行代码的背景下 - this.context =上下文; –

+0

我添加了这个: '新的Thread(){ \t \t \t \t公共无效的run(){ \t \t \t \t \t((活动)上下文).runOnUiThread(新的Runnable(){ \t \t \t \t \t \t @Override \t \t \t \t \t \t公共无效的run(){\t \t \t \t \t \t \t \t \t通信System.err.println( “现身!”); \t \t \t \t \t \t \t mDialog.show(); \t \t \t \t \t \t} \t \t \t \t \t}); \t \t \t \t \t \t尝试{ \t \t \t \t \t \t \t睡眠(5000); \t \t \t \t \t \t}赶上(InterruptedException的发送){ \t \t \t \t \t \t \t // TODO自动生成的catch程序块 \t \t \t \t \t \t \t e.printStackTrace(); \t \t \t \t \t \t} \t \t \t \t \t \t mDialog.dismiss(); \t \t \t} \t \t \t};'但是对话框不显示? – ffrstar777

1

你这样做

context.runOnUIThread(new Runnable() { 
      public void run() { 
        // show the Dialog 
        mDialog.setTitle("Please wait"); 
        mDialog.setMessage("Please wait"); 

        mDialog.show(); 
       } 
      }); 
     } 

    Thread.sleep(5000); 

     context.runOnUIThread(new Runnable() { 
      public void run() { 
        // Dismiss the Dialog 
        mDialog.dismiss(); 
       } 
      }); 
+0

这是正确的吗? 'mHandler.postDelayed(新的Runnable(){ \t \t \t公共无效的run(){ \t \t \t((活动)上下文).runOnUiThread(新的Runnable(){ \t \t \t公共无效的run(){ \t \t \t //关闭该对话框 \t \t \t mDialog.dismiss(); \t \t \t} \t \t \t}); \t \t \t} \t \t \t},5000);' – ffrstar777

+1

肯定的。正确..... – Ronnie

+0

我调试它,发现应用程序崩溃在mDialog.show()与相同looper.prepare错误。有没有办法使用show()的处理程序? – ffrstar777

1

这是您将在任何线程或任何后台任务中执行任何UI操作时得到的异常。此外context.runOnUiThread将无法​​正常工作。

而是使用:

activity.runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
          mDialog.dismiss(); 
          } 
          }); 

您可以使用相同的用来表示在activityactivity的对象。