0

たくさんのスニペットとチュートリアルを読んだので、私はまだ(またはそれ以上に)進むべき道について混乱しています。ソケットで着信イベントをリッスンし、UIThreadに着信を報告するスレッド/バックグラウンドタスクが必要です。選択するための好ましい方法は何でしょうか?独自のスレッドまたはマルチタスク?データをメインスレッドに転送する最良の方法は?

問題についての考えに感謝します。

よろしく、マーカス

以下のあなたの答えを考慮して、私は以下を試しました:

主な活動:

public class MainActivity extends Activity {


Handler handler = new Handler() {

    @Override
       public void handleMessage(Message msg) {
            toastSomething();
      };
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    threadstarter();
}


protected void threadstarter() {

    super.onStart();

    Thread backgroundthread = new Thread(new WorkerThread(handler));
    backgroundthread.start();
}

public void toastSomething() {
    Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
} }

私のランナブル:

public class WorkerThread implements Runnable {

Handler messageHandler;

WorkerThread(Handler incomingHandler) {
    messageHandler = incomingHandler;
}

public void run() {

    while (true) {

        for (int i = 0; i <= 100000; i++) {
            // wait a moment
        }
        messageHandler.sendEmptyMessage(1);
    }
} }

私のレイアウトには追加のチェックボックスしかありません:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="CheckBox" />

良いことは、トーストが表示されることです。悪いことに、cehckboxが応答せず、アプリがすぐにクラッシュします。そうではないですか、それはどのように行われるべきですか?

編集:例外が言うように、WorkerThreadのsendMessageのメッセージはトラブルメーカーのようです、メッセージはすべて使用中に読み取られますか?

4

4 に答える 4

0

バックグラウンドからUIThreadと通信する唯一の方法は

runOnUIThread(new Runnable {.// your ui stuff goes here.});

handler.post(new Runnable{.// your ui stuff goes here.});

私は他に何も考えられません..これらの2つはすべての状況で非常に便利です..

ルで

于 2012-07-02T10:46:42.460 に答える
0

このようにバックグラウンドスレッドからUIThreadに通信できます

Runnable runnable = new Runnable() 
{
@Override
public void run() {
    for (int i = 0; i <= 10; i++) {
        handler.post(new Runnable() {
            @Override
                public void run() {
                    progress.setProgress(value);
                }
            });
        }
    }
};
于 2012-07-02T11:13:58.333 に答える
0

クラスを使用して、、、、またはメソッド内のUIスレッドに投稿することができますAsyncTaskonPreExecute(...)onPostExecute(...)onProgressUpdate(...)

もう1つの方法は、バックグラウンド作業に新しいスレッドを使用し、にを投稿するRunnableことHandlerです。

UIスレッドでインスタンス化するHandlerと、ハンドラーに投稿するすべてのものがUIスレッドで実行されます。バックグラウンドスレッドでハンドラーをインスタンス化すると、ハンドラーに投稿するすべてのものがバックグラウンドスレッドで実行されます。

于 2012-07-02T11:30:25.810 に答える
0

これが最終的に機能しているコードです:

UIThread:

public class MainActivity extends Activity {

    public static final String LOG_TAG = "UIThread";

    Handler handler = new Handler() {

        @Override
           public void handleMessage(Message msg) {
                toastSomething();
                //Log.v(LOG_TAG, "main thread");
          };
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        threadstarter();
    }

    protected void threadstarter() {

        super.onStart();

        Thread backgroundthread = new Thread(new WorkerThread(handler));
        backgroundthread.start();
    }

    public void toastSomething() {
        Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
    }
}

WorkerThread:

public class MainActivity extends Activity {

    public static final String LOG_TAG = "UIThread";

    Handler handler = new Handler() {

        @Override
           public void handleMessage(Message msg) {
                toastSomething();
                //Log.v(LOG_TAG, "main thread");
          };
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        threadstarter();
    }

    protected void threadstarter() {

        super.onStart();

        Thread backgroundthread = new Thread(new WorkerThread(handler));
        backgroundthread.start();
    }

    public void toastSomething() {
        Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
    }
}

HTH誰か。入力してくれたすべての人に感謝します。

于 2012-07-03T07:12:32.147 に答える