for (int i = 0; i < jsonArray.length(); i++) {
JSONObject row = jsonArray.getJSONObject(i);
String itemid = row.optString("id");
JSONArray arry = row.getJSONArray("values");
if(i == 0){
}
else{
final int ar = arry.length();
final int tot = g + ar ;
int h = 0;
for (int j = g ; j < tot; j++) {
JSONObject rw = arry.getJSONObject(h);
String extraName = rw.optString("extraName");
String extraId = rw.optString("extraId");
if(namechklist.size() > 0){
if(namechklist.contains(extraName)){
rw.put("isEnabled","1");
}
}
if(nameunchklist.size()>0){
if(nameunchklist.contains(extraName)){
rw.put("isEnabled","0");
}
}
if(j >= arry.length()){
}else{
String gh = String.valueOf(priceidslist.get(j));
if(gh.equals(extraId)){
rw.put("extraPrice",pricelist.get(j));
}
}
h++;
}
g = arry.length();
}
}
Log.d("chk", "res:last "+jsonArray.toString());
}
JSONArray extraArray = obj.getJSONArray("Extras");
for (int i = 0; i < extraArray.length(); i++) {
JSONObject rw = extraArray.getJSONObject(i);
String extraName = rw.optString("extraName");
String extraId = rw.optString("extraId");
if(exnamechklist.size() > 0){
if(exnamechklist.contains(extraName)){
rw.put("isEnabled","1");
}
}
if(exnameunchklist.size()>0){
if(exnameunchklist.contains(extraName)){
rw.put("isEnabled","0");
}
}
}
Я только что изменил условие цикла и изменил формат получения значений json, теперь он работает нормально
Настолько простой:
def DestinationThread( a ) :
while True :
items = q.get()
func = items[0]
args = items[1:]
func(*args)
Другая интересная опция состоит в том, чтобы просто передать в лямбде.
q.put(lambda: HandleMsg(1,2))
q.put(lambda: HandleAnother(8, "hello", extra="foo"))
def DestinationThread() :
while True :
f = q.get()
f()
from Queue import *
from thread import *
from time import *
q = Queue()
def HandleMsg( arg1, arg2 ) :
print arg1, arg2
def HandleAnotherMsg( arg1, arg2, arg3 ) :
print arg1, arg2, arg3
def DestinationThread() :
while True :
f, args = q.get()
f(*args)
start_new_thread( DestinationThread, tuple() )
print "start"
sleep( 1 )
q.put( (HandleMsg, [1, 2]) )
sleep( 1 )
q.put( (HandleAnotherMsg, [1, 2, 3]) )
sleep( 1 )
print "stop"
Я использовал подобную конструкцию прежде:
class Call:
def __init__(self, fn, *args, **kwargs):
self.fn = fn
self.args = args
self.kwargs = kwargs
def __call__(self):
return self.fn(*self.args, **self.kwargs)
x = Call(zip, [0,1], [2,3], [4,5])
Необходимо затем смочь передать x другому потоку и назвать его оттуда:
x() # returns the same as zip([0,1], [2,3], [4,5])
Можно создать абстрактный класс сообщений с методом выполнения. Затем для каждой функции, которая должна быть передана через очередь, подкласс и реализовать функцию как метод выполнения. Передающий поток создаст экземпляр надлежащего sub класса и поместит его в очередь. Поток получения получит объект от очереди и вслепую выполнит метод выполнения.
Это обычно называют Шаблоном "команда" (Gamma и др.)
Пример:
class Message (object):
"""abstract message class"""
def __init__(self, **kwargs):
self.kwargs = kwargs
def run(self):
pass
class MessageOne (Message):
"""one message class"""
def run(self):
# perform this emssage's action using the kwargs
Отправитель инстанцирует и отправит сообщение:
queue.put(MessageOne(one='Eins', two='Deux'))
Получатель просто получает объект сообщения, и выполните выполненный метод (не имея необходимость к нему.. еще.. через доступные типы сообщений):
msg = queue.get()
msg.run()
Это кажется, что Вы хотите использовать apply()
внутренний или его преемник:
def f(x. y):
print x+y
args = ( 1, 2 )
apply(f, args) # old way
f(*args) # new way
Почему Вы не разделяете Очередь на подклассы?
class MyQueue(Queue):
# by using *args, you can have a variable number of arguments
def put(self,*args):
for arg in args:
Queue.put(self,arg)
или, почему Вы не помещаете список?
list = [function_obj]
for arg in function_args:
list.append(arg)
queue.put(list)