0

d.android.comに従って推奨されているため、HttpClientを起動する関数にスレッドを実装しようとしています。スレッドを実装しましたが、スレッドコードを削除したように実行されないようです。結果が表示されます。 。

これは私のコードです:

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_box);// sd
    TextView inbox = (TextView) findViewById(R.id.inbox);
    final Functions function = new Functions();
    final SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    where = prefs.getString("chat", "null");

    class SendThread extends Thread {
           public void run(){
                //getInbox() runs an http client
               listOfMessages = function.getInbox(where);

           }
        }
    SendThread sendThread  = new SendThread();
    sendThread.start();

    inbox.setText(listOfMessages);

}

上で述べたように、スレッドコードを削除すると、完全に機能します。私が間違っていることについて何か考えはありますか?スレッドを使用するのはこれが初めてです。ルーキーのミスをお詫びします。

エラーは発生しませんが(少なくともエラーは表示されません)、スレッドコードを挿入せずに取得した出力は表示されません。

4

2 に答える 2

2

私は他の人たちに同意します:1)スレッドが終了するのに時間がかからなかった、2)メインスレッドのUIを変更する必要があります。私はあなたが具体的な解決策を見たいと思うかもしれないと思ったので、ここに行きます:

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

    final Functions function = new Functions();
    final SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    where = prefs.getString("chat", "null");
    new AsyncTask<String, Void, String>() {
        @Override
        protected String doInBackground(String... args) {
            return function.getInbox(args[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            TextView inbox = (TextView) findViewById(R.id.inbox);
            inbox.setText(result);
        }

    }.execute(where);
}

AsyncTaskを使用すると、これが非常に簡単になります。これは、メインスレッドから簡単なタスクを実行するためのAndroid推奨の方法です。execute()が呼び出されると、新しいスレッドが作成され、doInBackground()が呼び出されます。次に、結果がメインスレッドでonPostExecuteメソッドに返されます。したがって、runOnUiThreadなどを処理する必要はありません。

この場合に注意する必要があるのは、向きの変更などの場合、アクティビティが破棄されて再作成されるため、getInbox()の呼び出しが再度呼び出されることです。メソッドが実際にかかる時間に応じて、これは問題になる場合と問題にならない場合があります。受け入れられない場合は、静的なAsyncTaskのようなものが必要ですが、新しいアクティビティにアタッチし直すという問題が発生します。私はそれについて言及しているだけです。あなたが今それを処理しなければならないからではなく、あなたが気づいているからです。

于 2012-04-25T01:12:06.977 に答える
0

スレッドからlistOfMessagesの結果を取得しましたが、そのリストを受信ボックスのTextViewに投稿していません。スレッドが完全に実行されるまでに時間がかかる場合がありますが、コード

inbox.setText(listOfMessages);

スレッドが開始されると、下部にあるが実行されます。

したがって、inbox.setText(listOfMessages);を呼び出す必要があります。スレッドが最新のlistOfMessagesを取得したら。ただし、UI以外のスレッドではUI操作(setTextなど)を実行できません。

多くの選択肢があります。1。スレッドコードでハンドラークラスを使用できます。listOfMessagesを取得したら、ハンドラーを使用してUIスレッドにメッセージを投稿できます。あなたはサンプルのためにハンドラーをグーグルすることができます。

  1. 上記のコードがアクティビティに含まれている場合は、アクティビティでrunOnUiThreadを呼び出すヘルパーメソッドを使用できます。のようなものです。

    MyActivity.this.runOnUiThread(new Runnable(){inbox.setText(listOfMessages);});

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

于 2012-04-25T00:44:08.283 に答える