1

私はアンドロイドが初めてです。色が値に達したときに何かをするのが好きです。(たとえば) r が 30 より大きい場合にアラートを表示するのが好きですが、アプリケーションがクラッシュします。非常に簡単な回答をありがとう。

public class MainActivity extends Activity { 
private AlertDialog dialog; 
private AlertDialog.Builder builder; 
private BackgroundColors view; 

public class BackgroundColors extends SurfaceView implements Runnable { 
public int grand=0;
public int step=0;
private boolean flip=true;
private Thread thread; 
private boolean running; 
private SurfaceHolder holder; 

public BackgroundColors(Context context) { 
super(context); 
} 

実行中のこのループ内は true です。ダイアログを表示することは不可能ですか??

public void run() { 
 int r = 0; 
while (running){ 
if (holder.getSurface().isValid()){ 
     Canvas canvas = holder.lockCanvas(); 
     if (r > 250) 
      r = 0; 
     r += 10; 

     if (r>30 && flip){
            flip=false;


    //      *********************************
            dialog.show(); 
    //      *********************************
    //      CRASH !!        


       }

     try { 
      Thread.sleep(300); 
     } 
     catch(InterruptedException e) { 
      e.printStackTrace(); 
     } 
     canvas.drawARGB(255, r, 255, 255); 
     holder.unlockCanvasAndPost(canvas); 

   } 
   } 





  } 

  public void start() { 
   running = true; 
   thread = new Thread(this); 
   holder = this.getHolder(); 
   thread.start(); 
  } 

  public void stop() { 
   running = false; 
   boolean retry = true; 
   while (retry){ 
    try { 
         thread.join(); 
         retry = false; 
    } 
    catch(InterruptedException e) { 
         retry = true; 
} 
   } 
  } 

  public boolean onTouchEvent(MotionEvent e){ 
   dialog.show(); 
   return false; 
  } 
  protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){
      super.onSizeChanged(xNew, yNew, xOld, yOld);
      grand = xNew;
      step =grand/15;
  }
} 

public void onCreate(Bundle b) { 
  super.onCreate(b); 
  view = new BackgroundColors(this); 
  this.setContentView(view); 
  builder = new AlertDialog.Builder(this); 
  builder.setMessage("ciao");
  builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
   public void onClick(DialogInterface dialog, int which) { 
     Log.d("Basic", "It worked"); 
   } 
  }); 
  dialog = builder.create(); 
} 

public void onPause(){ 
  super.onPause(); 
  view.stop(); 
} 

public void onResume(){ 
  super.onResume(); 
  view.start(); 
} 
} 
4

1 に答える 1

0

スレッドでダイアログを表示することはできません。これにはハンドラーを使用する必要があります。メインスレッドでハンドラーを作成してスレッドに送信し、スレッドで dialog.show() の代わりにメッセージをハンドラーに送信し、の handleMessage メソッドで送信する必要がありますハンドラーは、dialog.show() を書き込みます。例:

Handler handler = new Handler(){ 
@Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case 1:
              dialog.show();
break;
}}};

スレッドでメッセージを送信します。

handler.sendEmptyMessage(1);
于 2012-10-24T06:31:42.983 に答える