我有一个实现runnable的类,它创建了一些任务,然后更新了一些视图:
public class DownloadPics implements Runnable {
@Override
public void run() {
//retrieve data
fillView(data);
}
public void refreshView(ArrayList<Object> new_pics) {
LinearLayout linearLayout = (LinearLayout) ((Storico)context).findViewById(R.id.linearInsideScroll);
View new_imageView = inflater.inflate(R.layout.history_element,
null, false);
//Build fill view
linearLayout.addView(new_imageView);
}
}
当我在refreshView方法上调用addView时获取错误:
Only the original thread that created a view hierarchy can touch its views.
怎么了?
答案 0 :(得分:1)
只有创建视图层次结构的原始线程才能触及它 视图。
从后台线程更新ui。
您无法从后台线程更新ui。您可以从ui线程更新ui。
使用AsyncTask
可让您更轻松。您可以在doInBackground
中进行背景计算,并在onPostExecute
答案 1 :(得分:0)
使用此方法runOnUiThread(Runnable action)
修改强>
使用ASyncTask
和runOnUiThread
class download extends AsyncTask<Void, Void, Void>
{
String message = "";
ProgressDialog dialog = new ProgressDialog(v.getContext());
@Override
protected void onPreExecute()
{
// what to do before background task
dialog.setTitle("Downloading");
dialog.setIndeterminate(true);
dialog.setMessage(message);
dialog.setCancelable(false);
dialog.show();
}
void updateItem(int i)
{
class UpdateItem implements Runnable
{
int pos;
UpdateItem(int i) { pos = i; }
public void run()
{
dialog.setMessage(message);
}
}
runOnUiThread(new UpdateItem(i));
}
@Override
protected Void doInBackground(Void... params) {
downloadStuff();
i++
updateItem(i);
}
@Override
protected void onPostExecute(Boolean result) {
// what to do when background task is completed
dialog.dismiss();
};
};
new download().execute((Void[]) null);
答案 2 :(得分:0)
您需要来自在主线程上创建的Handler的引用(确保它是在主线程上创建的)。
Handler handler = new Handler();
在DownloadPics的run()方法中,您将使用:
handler.post(new Runnable(){
public void run(){
//update UI on main thread
}
}