线程间通讯的问题

warcraftmgq 2016-01-09 12:08:20
现在需要封装一个类来处理底层数据,类中开启一个线程来持续采集数据,待数据满足某种条件(比如数据长度等)时通过Listener来通知调用者,但是调用者在响应时如果涉及到UI则会报错,应如何解决?
类代码:

public class MyClass {
private MyThread mThread = null;
private boolean isRunning = false;
private OnChangeListener listener = null;
private boolean flag = false;

private class MyThread extends Thread {
@Override
public void run() {
super.run();
while (isRunning && !isInterrupted()) {
if (flag) {
listener.onChanged();
flag = false;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
break;
}
}
}
}

public interface OnChangeListener {
public void onChanged();
}

public void setMyListender(OnChangeListener l) {
listener = l;
}

public void start() {
if (null == mThread) {
mThread = new MyThread();
isRunning = true;
mThread.start();
}
}

public void flag() {
flag = true;
}
}


Activity代码

public class MainActivity extends Activity {
private MyClass mc = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mc = new MyClass();
mc.setMyListender(new MyClass.OnChangeListener() {
@Override
public void onChanged() {
//这里如果涉及到UI相关的操作则报错
}
});
mc.start();
}
...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2016-01-10
  • 打赏
  • 举报
回复
因为onChanged是在子线程中调用的,而子线程不能有更新UI的操作。最简单的做法就是在MainActivity中弄一个Handler:

public class MainActivity extends Activity {
    private MyClass mc = null;
    private Handler mHandler = new Handler();//Handler
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mc = new MyClass();
        mc.setMyListender(new MyClass.OnChangeListener() {
            @Override
            public void onChanged() {
                mHandler.post(new Runnable(){@Override public void run(){
                     //这里做UI更新
                }});
            }
        });
        mc.start();
    }
bobo928843007 2016-01-09
  • 打赏
  • 举报
回复
数据传输按理来说传输对象比较好,因为是传引用(就像指针一样),基础类型传值,但是android的一些对象数据传输完全赋值对象就不好说了(如c 的memcpy)。Java对大量数据的处理真的很慢,android的图像数据交给了skia opengl (es)等这些c++库来处理。
bobo928843007 2016-01-09
  • 打赏
  • 举报
回复
我的数据量很大200万byte
bobo928843007 2016-01-09
  • 打赏
  • 举报
回复
我做的和你差不多,我是在service里创建线程的,然后在异步任务类里通过binder读取。但是byte数组经过几次赋值速度很慢,现在考虑直接在异步任务类里接收Socket数据。android多线程更新UI不是安全的,handler队列使线程同步写UI buffer,你可以考虑用handler,或者runinUIthead或者异步任务类里更新。
lgxing 2016-01-09
  • 打赏
  • 举报
回复
广播通知行不行
MoneyCitys 2016-01-09
  • 打赏
  • 举报
回复
在子thread呼叫方法一樣是子thread UI需要用主Thread 用Handler呼叫吧
k_c_u_f 2016-01-09
  • 打赏
  • 举报
回复
在UI线程(也就是主线程)里面定义一个Handler,然后MyThread需要时调用这个Handler向UI线程发送消息

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧