Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANDROID:异步加载活动视图_Java_Android_Multithreading_Asynchronous - Fatal编程技术网

Java ANDROID:异步加载活动视图

Java ANDROID:异步加载活动视图,java,android,multithreading,asynchronous,Java,Android,Multithreading,Asynchronous,我有一个自定义的视图类,我想为我的活动设置它。然而,它的启动非常长(大多数代码,比如加载位图,都放在构造函数中)。因此,我想在设置视图之前向用户显示一个预加载程序 我已经尝试过先设置加载屏幕,然后使用asynctask和处理程序在不同的线程上启动视图,但没有成功。第一个给了我无法在未调用looper.prepare()的线程内创建处理程序,而另一个只需逐行执行代码 可能我做错了什么,有没有关于如何划分加载过程的想法,例如: 1.设置加载屏幕。 2.在后台加载查看类(实例化)。 3.设置视图类以代

我有一个自定义的
视图类
,我想为我的
活动
设置它。然而,它的启动非常长(大多数代码,比如加载位图,都放在构造函数中)。因此,我想在设置
视图之前向用户显示一个预加载程序

我已经尝试过先设置加载屏幕,然后使用asynctask和处理程序在不同的线程上启动
视图
,但没有成功。第一个给了我
无法在未调用looper.prepare()
的线程内创建处理程序,而另一个只需逐行执行代码

可能我做错了什么,有没有关于如何划分加载过程的想法,例如: 1.设置
加载屏幕
。 2.在后台加载
查看类
(实例化)。 3.设置
视图类
以代替
加载屏幕

谢谢

更新


将加载所有位图和内容的代码移动到
AsyncTask
中,而不是在构造函数中执行。通过
onCreate
活动方法执行此操作

然后,您可以使用
AsyncTask
onProgressUpdate
回调通知进度(例如加载进度条)。例如,您可以使用
ProgresBar.setMax
将其设置为要加载的项目数,通过
publishProgress
加载项目时将其传递给进度回调,然后使用该值调用
ProgressBar.setProgress

加载项目时,可以将这些项目添加到
资产
类中。这可以通过
onPostExecute
回调方法传回,然后可以将回调方法分配给活动中的成员变量

然后,您可以使活动的布局如下所示:

LinearLayout
    RelativeLayout [id=load_screen, background=loading_bg]
        ProgressBar [id=loading_progress]
    RelativeLayout [id=main, visibility=hidden]
        ...
然后调用
findViewById(R.id.load\u screen).setVisible(View.go)
隐藏加载屏幕和
findViewById(R.id.load\u screen).setVisible(View.VISIBLE)

或者,您可以加载替换视图(通过
LayoutInflater.flate
调用),然后在其上调用
setContentView
。当
充气
调用返回时,视图已完全加载,因此您可以在此处执行所有处理程序设置


布局加载或可见性切换也将发生在
AsyncTask

onPostExecute
方法中。您能给我们看一下代码吗?:)@t0mm13b哦,它很乱。但是我不知道如何在不同的线程上加载视图,然后将其提供给Activity@t0mm13b如上所述,AsyncTask给了我一个aobve提到的错误
无法在线程内创建处理程序…
跨线程-
无法在线程内创建处理程序
-您在线程内设置的视图显然是错误的。
 new Handler().post(new Runnable(){
@Override
public void run(){
setContentView(new CustomView(context));
}
});
LinearLayout
    RelativeLayout [id=load_screen, background=loading_bg]
        ProgressBar [id=loading_progress]
    RelativeLayout [id=main, visibility=hidden]
        ...