2

問題があります。簡単なアプリケーションを作成して、問題を示します。Sleep が実行される前に setContentView が実行され、.xml が表示されるようにします。すべてが順番に実行されると思いましたか?なぜそうしないのか、私に言うことができる人はいますか?

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // do something
    }

どうもありがとう!

編集:

これが本当の OnCreate ですが、もっと大きな問題のようです。

スリープのすべてが正常に機能しましたが、Connect メソッドには問題があります。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

ConnectBluetooth();

}   

ConnectBluetooth() メソッドでは、新しい Socket を作成して接続を試みるだけです。

ned スレッドまたはハンドラーでは機能しないようですが、どうすればよいですか? asynctask のようなものを使用しますか?

ありがとうございます!

4

2 に答える 2

2

レイアウトは、作成プロセスが完了するまで表示されません。 afteronResume()が呼び出されます。ただし、レイアウトが表示されたときのコールバックはありませんが、Handler と Runnable を使用してこれを行うことができます。


いくつかのフィールド変数を作成します。

Handler handler = new Handler();
Runnable delay = new Runnable() {
    @Override
    public void run() {
        // Do something 
    }
};

そしてonCreate()呼び出します:

handler.postDelayed(delay, 10000);
于 2012-12-24T20:41:57.397 に答える
1

を呼び出すとsleep、UI スレッドが一時停止します。これonCreateにより、フレームワークがビュー階層の表示を含むアクティビティの初期化を完了できなくなります。

そのように UI スレッドを一時停止しないでください。10 秒後に何かを実行したい場合は、適切なタイミングで実行する別のスレッドを開始できます。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(10000);
                doSomething();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }.start();
}

よりクリーンなアプローチは、次を使用することHandlerです。

Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mHandler = new Handler();
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            doSomething();
        }
    }, 10000);
}
于 2012-12-24T20:41:26.490 に答える