在Runnable类中填充视图

时间:2014-04-24 13:37:17

标签: java android multithreading

我有一个实现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.

怎么了?

3 个答案:

答案 0 :(得分:1)

  

只有创建视图层次结构的原始线程才能触及它   视图。

从后台线程更新ui。

您无法从后台线程更新ui。您可以从ui线程更新ui。

使用AsyncTask可让您更轻松。您可以在doInBackground中进行背景计算,并在onPostExecute

中更新ui

答案 1 :(得分:0)

使用此方法runOnUiThread(Runnable action)

修改

使用ASyncTaskrunOnUiThread

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
    }
}