Как связать сервис с запущенным потоком в Android - PullRequest
2 голосов
/ 24 января 2012

Моя цель - запустить сервис, который позаботится обо всех потребностях сети приложения.

Я подумал, может быть, открыть 2 сокета для передачи данных. я хочу, чтобы данные обрабатывались асинхронно, поэтому я подумал, что мне следует запускать их в двух отдельных потоках, каждый для каждого сокета, и таким образом данные могут передаваться в две разные асинхронные "ссылки" ..

Итак, я был бы признателен за две вещи:

  1. лучший общий дизайн. может быть, я все неправильно понял ...

  2. Может ли кто-нибудь объяснить мне, как я могу общаться с этими тредами, когда мне нужно передать данные в / из них в / из основного сервиса? насколько я узнал (OS), мне нужно использовать СИГНАЛЫ :) (шучу ..)

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Ну, я могу сказать, что наконец-то понял, перед тем как сдаться. Это очень простое, чрезвычайно простое приложение, которое запускает поток внутри действия и обрабатывает двунаправленную связь, используя два разных обработчика для каждой сущности!

Код:

public class MainActivity extends Activity  {   
//Properties:   
    private final   String TAG = "Activity";            //Log tag
    private         MyThread mThread;                   //spawned thread 
    Bundle          myB = new Bundle();                 //used for creating the msgs
    public          Handler mHandler = new Handler(){   //handles the INcoming msgs 
        @Override public void handleMessage(Message msg) 
        { 
            myB = msg.getData();
            Log.i(TAG, "Handler got message"+ myB.getInt("THREAD DELIVERY")); 
        } 
    }; 
//Methods:
    //--------------------------
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        mThread = new MyThread(mHandler);
        mThread.start();
        sendMsgToThread();
    }
    //-------------------------- 
    void sendMsgToThread() 
    { 
        Message msg = mThread.getHandler().obtainMessage(); 
        myB.putInt("MAIN DELIVERY", 321);
        msg.setData(myB);
        mThread.getHandler().sendMessage(msg);
    } 
}
//=========================================================================================
//=========================================================================================

public class MyThread extends Thread{   
//Properties:
    private final   String TAG = "MyThread";            //Log tag
    private         Handler outHandler;                 //handles the OUTgoing msgs 
    Bundle          myB = new Bundle();                 //used for creating the msgs
    private         Handler inHandler = new Handler(){  //handles the INcoming msgs 
        @Override public void handleMessage(Message msg) 
        { 
            myB = msg.getData();
            Log.i(TAG, "Handler got message"+ myB.getInt("MAIN DELIVERY")); 
        } 
    }; 

//Methods:
    //--------------------------
    public void run(){
        sendMsgToMainThread();  //send to the main activity a msg
        Looper.prepare();
        Looper.loop();
        //after this line nothing happens because of the LOOP!
        Log.i(TAG, "Lost message");
    }
    //--------------------------
    public MyThread(Handler mHandler) {
        //C-tor that get a reference object to the MainActivity handler.
        //this is how we know to whom we need to connect with.
        outHandler = mHandler;
    }
    //--------------------------
    public Handler getHandler(){
        //a Get method which return the handler which This Thread is connected with.
        return inHandler;
    }
    //--------------------------    
    private void sendMsgToMainThread(){
        Message msg = outHandler.obtainMessage();   
        myB.putInt("THREAD DELIVERY", 123);
        msg.setData(myB);
        outHandler.sendMessage(msg);
    }
}
//=========================================================================================
//=========================================================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.test.namespace"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

вывод:

01-26 06:25:40.683: I/Activity(19560): Handler got message123
01-26 06:25:40.683: I/MyThread(19560): Handler got message321

Я понял это, читая предложенный пост от endian, здесь .

Я надеюсь, что другие найдут это полезным. удачи:)

0 голосов
/ 24 января 2012

Здесь - хороший пост, объясняющий темы и общение с помощью обработчиков. Кроме того, в этом же блоге есть ряд сообщений, касающихся различных конструкций потоков в Android.

Другая возможность - использовать AsyncTasks. Найти объяснение здесь

...