#java #android #multithreading
#java #Android #многопоточность
Вопрос:
Я хочу войти в систему с несколькими учетными записями, поэтому я использую потоки .. иногда это работает нормально, но иногда одна и та же учетная запись регистрируется несколько раз вместо оставшихся учетных записей…кто-нибудь, пожалуйста, дает предложения.
gmail_synclist=new CopyOnWriteArrayList<>();
gmail_synclist.clear();
gmail_synclist = Helpers.getArrayList(WelcomeMessage.this, "email_creds");
List<Thread> threads = new ArrayList<Thread>();
for( int i = 0; i < gmail_creds.size(); i ){
final int j = i;
Thread t = new Thread(new Runnable() {
public void run(){
synchronized (gmail_synclist) {
Helpers.sharedPreferencess(WelcomeMessage.this,"userEmail", gmail_creds.get(j).userEmail);
Helpers.sharedPreferencess(WelcomeMessage.this,"userPassword",gmail_creds.get(j).userPassword);
AccountSetupBasics.actionNewAccount(WelcomeMessage.this);
}
}
})
t.start();
threads.add(t);
}
// Let all threads to finish execution prior continuing main thread.
try {
for(Threat t: threads){
t.join();
}
} catch(InterruptedException ie){
ie.printStackTrace();
}
Комментарии:
1. вы хотите, чтобы ваша задача выполнялась последовательно или параллельно!
2. спасибо за ответ…. да, я хочу последовательно несколько входов в систему…
3. отлично, тогда используйте один поток обработчика и отправьте runnable для выполнения
4. Хорошо, но я новичок в концепции многопоточности, не могли бы вы, пожалуйста, привести пример кода….
5. Если вы хотите, чтобы это было последовательно, почему вы используете потоки? В последовательном выполнении нет «концепции многопоточности».
Ответ №1:
хорошо, но неправильно отформатирован, я покажу черно-белый фрагмент и поток обработчика
// Простой обработчик потока, класс
public class MyHandlerThread extends HandlerThread {
private final static String TAG_THREAD = MyHandlerThread.class.getSimpleName();
public MyHandlerThread() {
super("MyHandlerThread");
Log.e(TAG_THREAD, " ctor ");
}
}
// фиктивный фрагмент
private MyHandlerThread myHandlerThread;
public Handler mWorkerHandler;
int MSG_ONE;
int MSG_TWO;
@Override
public void onViewCreated(whatever) {
// start the thread
threadOperation();
// send a message
sendMessage(MSG_ONE)
}
private void threadOperation() {
System.out.println("tread started");
myHandlerThread = new MyHandlerThread();
myHandlerThread.start();
Looper looper = myHandlerThread.getLooper();
mWorkerHandler = new Handler(looper, new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.what == MSG_ONE){
// do your work based on that
// these are all in bankground thread, so any ui updation task
// use runOnUiTHread() or main thread handler to post task
}
else if(msg.what == MSG_TWO){
// do work based on two
}
return true;
}
});
}
public void sendMessage(int whatMsg) {
System.out.println("send message --------------------");
doSimulation();
Message message = mWorkerHandler.obtainMessage(whatMsg);
mWorkerHandler.sendMessage(message);
Log.e(TAG, "message sent ..");
}