Вот моя проблема:
Мне нужно сделать несколько запросов на сервере. Эти запросы должны быть сделаны один за другим, чтобы избежать смешивания. Для этого я использую мониторы.
Вот что я до сих пор придумал:
public class TestActivity extends Activity
{
private String key;
private HashMap<String, String> values;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
values = new HashMap<String, String>();
ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");
createValues(list);
}
private void createValues(final ArrayList<String> list)
{
Thread thread = new Thread(new Runnable() {
@Override
public void run()
{
key = null;
for (String element : list)
{
if (key != null) // Every time except the first time.
{
synchronized (key)
{
try
{
key.wait();
}
catch (InterruptedException e)
{
}
}
}
key = element;
DataProcessor dataProcessor = new DataProcessor();
dataProcessor.execute("Processed " + element);
}
}
});
}
private void putDataInValue(String element)
{
synchronized (key)
{
values.put(key, element);
key.notify();
}
}
private class DataProcessor extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// Fetching data on a server. This takes time.
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
}
return params[0] + " from the server";
}
@Override
protected void onPostExecute(String result)
{
putDataInValue(result);
}
}
}
После этого мне хотелось бы, чтобы содержание values
было:
[
"foo" => "Processed foo from the server",
"bar" => "Processed bar from the server",
"baz" => "Processed baz from the server"
]
Мне нужно сохранить значения в list
и знать, какое из них соответствует какому контенту (следовательно, монитору).
Моя проблема в том, что в LogCat постоянно появляется сообщение об ошибке:
Can't create handler inside thread that has not called Looper.prepare()
Я искал в Интернете, нашел людей, у которых была эта проблема, посмотрел на ответы, большинство из которых сказали, что мне нужно использовать обработчики. Обработчики тоже не работают. Я пытался заменить нить на
handler = new Handler(Looper.getMainLooper);
handler.post(new Runnable //...
//...
но он просто зависает.
Я готов признать, что мой подход неверен и начать все заново, если вы думаете, что я в тупике. Что бы вы сделали?