Java 可运行类内的填充视图

Java 可运行类内的填充视图,java,android,multithreading,Java,Android,Multithreading,我有一个实现runnable的类,它完成了一些任务,然后更新了一些视图: public class DownloadPics implements Runnable { @Override public void run() { //retrieve data fillView(data); } public void refreshView(ArrayList<Object> new_pics) {

我有一个实现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);
    }
}

怎么了?

使用此方法
rununuithread(可运行操作)

编辑

使用
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);  
类下载扩展了异步任务
{
字符串消息=”;
ProgressDialog=新建ProgressDialog(v.getContext());
@凌驾
受保护的void onPreExecute()
{
//背景任务之前要做什么
对话框.setTitle(“下载”);
对话框。setUndeterminate(true);
设置消息(消息);
对话框。可设置可取消(false);
dialog.show();
}
void updateItem(int i)
{
类UpdateItem实现可运行
{
int pos;
UpdateItem(inti){pos=i;}
公开募捐
{
设置消息(消息);
}
}
runOnUiThread(新更新项(i));
}
@凌驾
受保护的Void doInBackground(Void…参数){
下载资料();
我++
更新项目(i);
}
@凌驾
受保护的void onPostExecute(布尔结果){
//后台任务完成后要做什么
dialog.dismise();
};
};
新下载().execute((Void[])null;
只有创建视图层次结构的原始线程才能接触其 观点

从后台线程更新ui


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


使用
AsyncTask
会更简单。您可以在
doInBackground
中进行后台计算,并在
onPostExecute
中更新ui。您需要在主线程上创建的处理程序的引用(确保它是在主线程上创建的)

在DownloadPics的run()方法中,您将使用:

handler.post(new Runnable(){
    public void run(){
        //update UI on main thread
    }
}

您无法从后台线程更新ui。如果我将refreshView方法放在调用方活动中,并从run方法调用它,则会得到相同的erroruse asynctasjinstead@giozh这是为什么??如果做得好,为什么不可以使用呢?因为我正在加载大量数据,并且需要在数据可用时刷新视图。使用asynctask,我需要等待下载finish@giozh如果下载需要很长时间,请使用intent服务。Asynctask的持续时间很短。但是您不能从非ui线程更新ui那么您尝试过这种方法吗?线程进行下载,在数据可用时创建一个侦听器,然后它将触发一个方法,该方法将使用新视图刷新UI。。。?只是一个想法。。。如果您不知道如何使用asyntask,我就不能使用它,因为线程执行网络操作,所以我得到了NetworkOnMainThread例外。例如Raghunandan,您需要使用
ASyncTask
。将这个特殊的位粘贴到一个runnable中,如果需要实时运行,它将在
doInBackground
方法中的Ui线程上运行。我有一个类似的函数。它只会更新等待对话框(下载作业),但原理是一样的。我把它加在了上面。这正是你需要的。
Handler handler = new Handler();
handler.post(new Runnable(){
    public void run(){
        //update UI on main thread
    }
}