如何解决如何让Asynctask以不同方式更新UI
| 我经常在使用Asyntask时遇到这个问题。联系UI线程的方法是调用publishProgress(),此方法只接受一个参数类型的数组。 在后台运行的线程执行复杂的计算可能需要使用不同类型的对象在不同点更新UI。 让我用一个例子说明:...do some processing...
// Send UI thread the integer values of the width & height of the image
...do some more processing...
// Send UI thread a String with custom message.
...do some more processing...
// Send UI thread an instance of MyObject so it can extract & display certain values
...do some cleanup job & finish...
但是,onProgressUpdate()仅接受一种类型的数组。
那么,我应该使它成为一个包含所有对象的类型吗?由于可以从第1、2或3行调用此方法,因此我怎么知道如何下调它,现在几点了?
当然必须有一个好的方法来实现这一目标?
编辑:如果要在Android中实现,我真的很想看到的是某种定义publishProgress1(用户定义的args1),publishProgress2(用户定义的args2),publishProgress3(用户定义的args3)的方法。 。
解决方法
在第三种情况下...
//向UI线程发送MyObject的实例
...有一个说法是您将在onPostExecute()中执行此操作,尽管这取决于您在插图中的含义。
您可以按照建议轻松地传递所有包含对象。该对象可以具有各种字段(整数,字符串,对象),外加一个“动作”以描述这些字段中的哪些有效且需要进行处理。
您可以简单地传递一个整数枚举,例如
PROCESS_INT_WIDTH_AND_HEIGHT
,PROCESS_STRING_MESSAGE
,PROCESS_OBJECT
等。没有什么可以阻止您这样做的...
private static class MyAsyncTask extends AsyncTask<String,int,Void> {
private int width;
private int height;
private String customMessage;
private MyObject myObject;
@Override
protected Void doInBackground(String... params) {
width = 10;
height = 10;
publishProgress(PROCESS_INT_WIDTH_AND_HEIGHT);
}
protected void onProgressUpdate(int... progress) {
if (progress == PROCESS_INT_WIDTH_AND_HEIGHT)
// Process width and height
}
}
换句话说,onProgressUpdate()方法仅响应一个“命令”并相应地处理相关的私有字段。
,如果要坚持使用AsyncTask,另一个选择是在不同时间使用不同的类,并使用instanceof测试类型。
但是,这听起来像是一个相对复杂的任务,所以我建议您考虑使用Handler并从常规线程或使用runOnUiThread将其发布为[Runnable] s2。
您可能还想阅读无痛线程
希望这可以帮助,
菲尔·莱洛
,我认为没有其他方法可以做到这一点。使用getType方法创建基类,然后将其用作适当的类型转换。
,在这种情况下,泛型类型可以工作吗?您可以根据需要键入值。示例AsyncTask
原型:
new AsyncTask<String,Object,List<?>>(){
...
我还记得阅读《 that5》最适合短时间的工作。考虑其他用于复杂且长时间运行的线程模型。
,如果您要返回的值在AsyncTask
处理中具有相应的状态,则可以在AsyncTask
内为所需的每个数据/类型创建一个私有成员,然后为每个状态/整数分配一个整数,并在onProgressUpdate(Integer...)
中放入一个switch(state)
来执行基于int状态的作业从ѭ12获得。
(这可能不是我给出的最明确的答案)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。