ここに私の問題があります:AsyncTask and Monitors
私はサーバー上でいくつかの要求をする必要があります。これらの要求は、混合を避けるために、順番に行う必要があります。そのために、私はモニターを使用しています。ここで
は、私がこれまでに作ってみたものです:
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 //...
//...
しかし、それは単にフリーズします。
私は自分のアプローチが間違っていることを認め、私が窮地に瀕していると思うならば、最初からやり直していきます。あなたならどうしますか ?
UIスレッドでAsyncTask.execute()を呼び出す必要があります。API [here](http://developer.android.com/reference/android/os/AsyncTask.html)をチェックしてください。 。アプリのターゲティングはどのAndroidバージョンで実行されますか? – yorkw
私はAPI 8(アンドロイド2.2)を使用しています。 UIスレッドに関しては、 'runOnUiThread()'を使用しようとしましたが、アプリケーションがフリーズしました。 – SteeveDroz