Java 可运行类内的填充视图
我有一个实现runnable的类,它完成了一些任务,然后更新了一些视图: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) {
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
}
}