android asynctask-asynctask无法更新主线程集合内容

问题描述

asynctask无法更新主线程集合内容

public class MainActivity extends Activity {
private ImageView iv;
public List data = new ArrayList();
private Bitmap[] res;
private int index;
static String URL="http://zhbj.qianlong.com/static/api/news/10007/list_1.json";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AsyncUtil().execute(URL);
stratImage();
}

private List<TestData> getJson(String url){
    List<TestData> data  = new ArrayList<TestData>();
    try {
        InputStream is = new URL(url).openStream();
        String json = readStream(is);
        JSONObject obj;
        TestData td;
        obj = new JSONObject(json);
        obj = obj.getJSONObject("data");
        JSONArray array = obj.getJSONArray("topnews");
        for(int i = 0; i < array.length(); i++){
            obj = array.getJSONObject(i);
            td = new TestData();
            td.icon = obj.getString("topimage");
            td.dataTitle = obj.getString("title");
            td.dataText = obj.getString("url");
            data.add(td);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return data;

}

private String readStream(InputStream is){
    InputStreamReader isr = null;
    String result ="";
    try {
        String line = "";
        isr = new InputStreamReader(is,"utf-8");
        BufferedReader reader = new BufferedReader(isr);
        while((line = reader.readLine()) != null){
            result += line;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return result;
}

//TODO
public void addBitmapArray(List<TestData> list){
    Bitmap bit = null;
    InputStream is = null;
    for (int i = 0; i < list.size(); i++) {
        try {
            URL u = new URL(list.get(i).icon);
            HttpsURLConnection conn = (HttpsURLConnection) u.openConnection();
            is = conn.getInputStream();
            bit = BitmapFactory.decodeStream(is);
            conn.disconnect();
            res[i] = bit;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

public Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        iv.setImageBitmap(res[(Integer)msg.obj]);
    }
};

public void stratImage(){
    new Thread(new Runnable(){
        @Override
        public void run() {
            while(true){
                Message msg = new Message();
                msg.obj = index;
                handler.sendMessage(msg);
                index++;
                if(index >= data.size()){
                    index = 0;
                }
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

//TODO
class AsyncUtil extends AsyncTask<String, Void, List<TestData>>{

    @Override
    protected List<TestData> doInBackground(String... params) {
        return getJson(params[0]);
    }

    @Override
    protected void onPostExecute(List<TestData> result) {
        data = result;
        addBitmapArray(result);
        super.onPostExecute(result);
    }
}

}

解决方案

AsyncTask不能更新UI,必须用handler,looper,ruanable才行

时间: 2024-10-31 00:19:17

android asynctask-asynctask无法更新主线程集合内容的相关文章

Android中AsyncTask的用法实例分享_Android

*  AsyncTask         看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多:第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负. 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿.         为了解决这一问题,OPhone在1.5版本引入了Async

Android Handler主线程和一般线程通信的应用分析_Android

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会

C# 主线程传递参数给子线程

问题描述 我是用了一个类,然后传递参数过去,我想问下,主线程想要用到子线程算出的数据的话,然后在更新主线程界面,我是用的回调函数,然后回调的主线程函数还是子线程的.我想问下回调函数有啥子用啊,告诉主线程我子线程做完了,然后主线程开始调用?回调函数本身还是属于子线程的.如果说主线程需要用到子线程的值只能回调函数吗? 解决方案 解决方案二:可以解耦两个对象,类似事件一样

Android中AsyncTask的简单用法

        在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验.但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误.因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户.这样就解决了子线程更新UI的问题.但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题.因此an

Android中AsyncTask异步任务使用详细实例(一)_Android

AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

详解Android中AsyncTask机制_Android

在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制. AsyncTask                                                                                AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更

我的Android进阶之旅------&amp;gt;Android中AsyncTask源码分析

在我的<我的Android进阶之旅------>android异步加载图片显示,并且对图片进行缓存实例>文章中,先后使用了Handler和AsyncTask两种方式实现异步任务机制. 下面先来看一段代码,这段代码是用来显示条目时候调用的方法. @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView = null; TextView textV

Android中AsyncTask异步任务使用详细实例(一)

AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

详解Android中AsyncTask机制

在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制. AsyncTask AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个