1

以下のコードを実行するonCreateメソッドがあります。一言で言えば、コードはサーバーからデータを取得し、メッセージングプログラムの画面に表示します。一度だけ実行しますが、3秒ごとにAsyncTaskを実行したいと思います(チャットをシミュレートするため)。これがチャットシステムを使用する方法ではないと確信していますが、(概念実証として)今のところ機能するものが必要であり、後でそれを実装する正しい方法に焦点を当てます。

@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());
        whatroom = 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);
                ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);
                progressBar.setVisibility(View.GONE);
                inbox.setText(result);
            }

        }.execute(whatroom);
    }

asynctaskの周りに単純なwhileステートメントを配置しようとしましたが、強制的に閉じます。

4

2 に答える 2

2

AsyncTaskインスタンスを再利用することはできません。ループのパスごとに新しいインスタンスを作成する必要があります。

于 2012-04-25T23:11:40.213 に答える
0

追加情報がなければ、具体的な答えを出すのは困難です。ただし、ローダーを使用してService、などを使用してすべてを抽象化することを検討してください

についてLoaders

  • それらはすべてのアクティビティとフラグメントで利用できます。
  • それらはデータの非同期ロードを提供します。
  • データのソースを監視し、コンテンツが変更されたときに新しい結果を提供します。
  • 構成の変更後に再作成されると、最後のローダーのカーソルに自動的に再接続します。したがって、データを再クエリする必要はありません。
于 2012-04-25T23:07:08.167 に答える