1

だから私はメインUIスレッドを持っていて、かなり時間がかかる関数があります。そのため、その間、画面に何かを表示したいのですが、GUI通信が必要になるため、関数をスレッドに組み込みたくありません。

だから私が必要なのはこれです

 Message msg;
 msg.wait("wait dude");
 //my code
 msg.dismis_wait();

何か案は?

コードをスレッドに入れてみましたが、コードの最後でビューを変更する必要があり、スレッドからそれを行うことができないという問題があります。

4

5 に答える 5

1

Message使用したいものではありません。

で試してみてくださいToast Notifications

ドキュメントの例の下に:

Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;

Toast toast = Toast.makeText(context, text, duration);
toast.show();
于 2012-09-24T10:26:07.463 に答える
1

あなたはToast提案された他の答えのように使うことができます。

Thread実行時間の長いコードがある場合は、別のコードを使用し、ハンドラーを使用してメインスレッドにメッセージを送信し、画面を変更することもできます。

また、AsyncTaskを使用することもできます。これは、実行中にビューで変更を行うことができるAndroidの特別なスレッドであり、これはdoInBackgroundメソッドで行われます。

于 2012-09-24T10:39:57.297 に答える
0

トーストメッセージが必要な場合は、次のようにすることができます。

for (int i=0; i < 2; i++) { 
    Toast.makeText(yourclass.this, " Here you message ", Toast.LENGTH_LONG).show();
}

トーストの場合、表示するのは長いか短いかしか選択できませんが、時間を定義することはできません。ここに同じトーストメッセージを2回表示しているので、表示したい時間が2倍になります。

コード全体をscheduleTaskExecutor内に配置します。これは、バックグラウンドで1行ずつコードを実行します。トーストメッセージを最初に表示できるようにします。ここに例があります:

最初に宣言する

private ScheduledExecutorService scheduleTaskExecutor;



    scheduleTaskExecutor= Executors.newScheduledThreadPool(5);

    // This schedule a task to run every 10 seconds:

    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
      public void run() {

            for (int i=0; i < 2; i++){ Toast.makeText(yourclass.this, " Here you message ", Toast.LENGTH_LONG).show();}

            try {                 

            // your code here                       


            } catch (IOException e) {                          
               e.printStackTrace();                           
            }                                     

     // If you need update UI, simply do this:
     //   runOnUiThread(new Runnable() {
      //    public void run() {
            // update your UI component here.
        //    myTextView.setText("refreshed");
         // }
      //  });
      }
    }, 0, 10, TimeUnit.SECONDS);

次の方法でスレッドを停止できます。

 scheduleTaskExecutor.shutdownNow();

また、遅延して開始したり、1回だけ実行したりすることもできます。https://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.htmlのドキュメントを確認してください

于 2012-09-24T10:26:47.110 に答える
0

カウントダウンタイマーを使ってみてください。クラスは次のとおりです。-

public class MyCount extends CountDownTimer{
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
        }

    @Override
    public void onFinish() {
 // Dismiss message
     }

    @Override
    public void onTick(long millisUntilFinished) {

    }
}

onCreateまたはメッセージを表示する場所でこれを使用します。

MyCount counter = new MyCount(15000,1000);
    counter.start();
// Show message

タイマーを開始した後、メッセージにonFinishofCountDownTimer却下メッセージを表示します。オブジェクトの作成時に値を変更できます。最初の値、つまり「15000」はミリ秒単位の合計時間であり、2番目の値、つまり「1000」はミリ秒単位のティックあたりの時間です。

これがお役に立てば幸いです。

于 2012-09-24T10:49:18.180 に答える
0

@gabrjan:Ofir Aurクエリの正しい解決策を提案しました。メインスレッドでlong/cpuを多用する操作を実行しないでください。AsyncTask / Threadを使用してバックエンド操作を実行し、ハンドラーインスタンスを使用してUIの更新を投稿します。UIを更新するためにrunOnUiThreadを使用することもできます。

 runOnUiThread(new Runnable() {
                public void run() {

                      HERE U CAN WRITE UR UI UPDATION CODE.
                }
            });
于 2012-09-24T10:52:40.220 に答える