博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步问题
阅读量:5875 次
发布时间:2019-06-19

本文共 4767 字,大约阅读时间需要 15 分钟。

============问题描述============

我想让下面的mythread中的循环执行完毕之后再在主线程里给messageList设置Adapter。
Thread myThread = new Thread(new Runnable() {			@Override			public void run() {				try {					Map
 map1 = new HashMap
(); map1.put("", ""); String retStr = ""; retStr = NetTool.sendGetRequest(messageShowUrl, map1, "utf-8"); String[] str = retStr.split(","); list = Arrays.asList(str); listAll.clear(); for (int i = 0; i < str.length / 5; i++) { Map
 map2 = new HashMap
(); map2.put("user_name", list.get(i * 5)); map2.put("object_words", list.get(i * 5 + 1)); map2.put("my_words", list.get(i * 5 + 2)); map2.put("date", list.get(i * 5 + 4)); // 如果用户没有传照片,map2中传的imageUrl就为空 System.out.println("list3 = " + list.get(i * 5 + 3)); if (!list.get(i * 5 + 3).equals(" ")) { String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/" + list.get(i * 5 + 3); String imageUrl = imageUrl1.replace(" ", ""); map2.put("imageUrl", imageUrl); } else { map2.put("imageUrl", ""); } listAll.add(map2); } } catch (Exception e) { e.printStackTrace(); } } }); myThread.start(); MyAdapter adapter = new MyAdapter(this); messageList.setAdapter(adapter);
于是我改成了下面的形式:
Thread myThread = new Thread(new Runnable() {			@Override			public void run() {				try {					Map
 map1 = new HashMap
(); map1.put("", ""); String retStr = ""; retStr = NetTool.sendGetRequest(messageShowUrl, map1, "utf-8"); String[] str = retStr.split(","); list = Arrays.asList(str); listAll.clear(); synchronized (this) { for (int i = 0; i < str.length / 5; i++) { Map
 map2 = new HashMap
(); map2.put("user_name", list.get(i * 5)); map2.put("object_words", list.get(i * 5 + 1)); map2.put("my_words", list.get(i * 5 + 2)); map2.put("date", list.get(i * 5 + 4)); // 如果用户没有传照片,map2中传的imageUrl就为空 System.out.println("list3 = " + list.get(i * 5 + 3)); if (!list.get(i * 5 + 3).equals(" ")) { String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/" + list.get(i * 5 + 3); String imageUrl = imageUrl1.replace(" ", ""); map2.put("imageUrl", imageUrl); } else { map2.put("imageUrl", ""); } listAll.add(map2); } notifyAll(); } } catch (Exception e) { e.printStackTrace(); } } }); myThread.start(); synchronized (myThread) { try { myThread.wait(); MyAdapter adapter = new MyAdapter(this); messageList.setAdapter(adapter); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
但是运行的时候直接就黑屏没有响应了,请问这是怎么回事?到底是哪里不对

============解决方案1============

你这里 myThread.wait();了,是在主线程里wait了啊,在等着线程里的notifyAll呢,当然会黑掉
你应该用handler来发消息

============解决方案2============

楼主,1楼的说法是正确的,这里我把你的代码整理了下  ,红色字体为关键处
package app.example.testapp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
Thread myThread = new Thread(new Runnable() {
 
        @Override
        public void run() {
            try {
                Map<String, String> map1 = new HashMap<String, String>();
                map1.put("", "");
                String retStr = "";
                retStr = NetTool.sendGetRequest(messageShowUrl, map1,
                        "utf-8");
                String[] str = retStr.split(",");
                list = Arrays.asList(str);
                listAll.clear();
                for (int i = 0; i < str.length / 5; i++) {
                    Map<String, Object> map2 = new HashMap<String, Object>();
                    map2.put("user_name", list.get(i * 5));
                    map2.put("object_words", list.get(i * 5 + 1));
                    map2.put("my_words", list.get(i * 5 + 2));
                    map2.put("date", list.get(i * 5 + 4));
                    // 如果用户没有传照片,map2中传的imageUrl就为空
                    System.out.println("list3 = " + list.get(i * 5 + 3));
                    if (!list.get(i * 5 + 3).equals(" ")) {
                        String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/"
                                + list.get(i * 5 + 3);
                        String imageUrl = imageUrl1.replace(" ", "");
                        map2.put("imageUrl", imageUrl);
                    } else {
                        map2.put("imageUrl", "");
                    }
                    listAll.add(map2);
                }
              
  handler.sendEmptyMessage(0);//给Handler发送消息
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==0) {//接收到对应的消息进行处理
MyAdapter adapter = new MyAdapter(this);
messageList.setAdapter(adapter);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myThread.start();// 开启线程
}
}

转载于:https://www.cnblogs.com/meizhenfen42/p/4033935.html

你可能感兴趣的文章
中小型商业银行的软件安全测试之道
查看>>
Flink运行时之TaskManager执行Task
查看>>
6、如何自学Struts2之Struts2值栈和OGNL语言[视频]
查看>>
听说网易用户信息泄露了?
查看>>
elk之elasticsearch 入门
查看>>
C++11 thread
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.39. GDBM-1.11...
查看>>
云:虚拟之上的管理平台
查看>>
决策统计---指标六要素
查看>>
开源要「开」得安全高效:开源云计算的五大发展趋势
查看>>
如何解决打开VS2010后没有UI界面的问题
查看>>
学点PYTHON基础的东东--数据结构,算法,设计模式---单向链表
查看>>
CSS实现带动画的购物图标
查看>>
android emulator虚拟设备分析第四篇之framebuffer
查看>>
PS黄金分割工具:黄金螺旋 黄金三角 黄金比例 三分法
查看>>
案例采访:中小企业融合IT架构选型
查看>>
如何从出行无线覆盖到智慧交通演变,锐捷智慧交通解决方案有一套
查看>>
Implementing Effective MySQL Database Backup Mechanisms
查看>>
Cocoa触发方法调用的几种方法
查看>>
数据中心能效的重要要素丨潜热与显热
查看>>