Обмен сообщениями между Android между потоком (в классе) и активом - PullRequest
2 голосов
/ 22 июня 2011

Как я могу отправить сообщение между действием и потоком, если поместить поток в класс?

Хорошо, вот немного более подробный код:

public class AnActivity extends Activity implements OnClickListener, Callback
{

    Button          b           = null;
    TextView        t           = null;
    MyThread        mThread     = null;
    public Handler  mainHandler = new Handler( this );

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

        b = ( Button ) findViewById( R.id.buttonSEND );

        b.setOnClickListener( this );
        mThread = new MyThread( this );
        mThread.start();
    }

    @Override
    public void onClick( View v )
    {
        Message m = Message.obtain();
        m.what = 4;
        mThread.myThreadHandler.sendMessage( m );
    }

    @Override
    public boolean handleMessage( Message msg )
    {
        Toast.makeText( this, "What= " + Integer.toString( msg.what ), Toast.LENGTH_SHORT ).show();
        return false;
    }
}

Следующий класс не является частью AnActivity

public class MyThread extends Thread
{
    public Handler myThreadHandler;
    Activity mainActivity;

    public MyThread ( AnActivity anActivity )
    {
        this.mainActivity = anActivity;     
    }


    @Override
    public void run()
    {
        Looper.prepare();
        myThreadHandler = new Handler()
        {
            // sending back a message immediately after a received one
            public void handleMessage( Message msg )
            {
                Message m = Message.obtain();
                m.what = 10;
                // MY PROBLEM:
                // mainActivity.mainHandler.sendMessage( m ); // mainHandler is not visible
                // mainActivity.sendMessage( m ); // does not working
            }
        };
        Looper.loop();
    }
}

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Это моя активность:

public class AnActivity extends Activity implements OnClickListener, Callback
{

    Button          b           = null;
    TextView        t           = null;
    MyThread        mThread     = null;
    public Handler  mainHandler = new Handler( this );


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

        b = ( Button ) findViewById( R.id.buttonSEND );

        b.setOnClickListener( this );
        mThread = new MyThread( this );
        mThread.start();
    }


    @Override
    public void onClick( View v )
    {
        Message m = Message.obtain();
        m.what = 4;
        mThread.myThreadHandler.sendMessage( m );
    }


    @Override
    public boolean handleMessage( Message msg )
    {
        Toast.makeText( this, "This is AnActivity. What=" + Integer.toString( msg.what ), Toast.LENGTH_SHORT ).show();
        return false;
    }
}

Модифицированный поток: В конструкторе я могу хранить обработчик сообщений потока пользовательского интерфейса.

0 голосов
/ 22 июня 2011

Вы можете создать конструктор в классе, где вы будете давать экземпляр действия. вот так:

public ConnectClass(Activity ac) {
    activity = ac;
}

В этом случае вам потребуется добавить переменную класса в класс потока с именем Activity.

0 голосов
/ 22 июня 2011

Я думаю, что вы ищете окно "Диалог", таким образом, вы можете показать пользователю предупреждающее сообщение, сообщение с подтверждением и т. Д.

Для получения дополнительной информации см. http://developer.android.com/reference/android/app/Dialog.html,

Вот хороший пример диалогового окна Alert: http://www.androidpeople.com/android-alertdialog-example/.

Из вашего комментария:

AlertDialog.Builder alt_bld = new AlertDialog.Builder(this).create();     
alt_bld.setMessage("apprika target achieve...");
alt_bld.setCancelable(false);
alt_bld.setPositiveButton("yes", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } });
alt_bld.setNegativeButton("No", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel(); } }); 
alert.show();

вставьте этот код в любой метод,просто позвоните, передав параметр.в текущем потоке или в действии.

попробуйте это.

...