我的Android代码中有一个事件处理机制,用于将传感器值转储到文件中。现在,我在主UI线程中这样做,因此UI按钮响应非常缓慢,我想加快它。
如何在事件处理函数上使用多线程?我试着这样做:
在类中创建一个如下所示的线程:
Thread thread1 = new Thread()
{
public void run()
{
if(writeNow == true)
{
try
{
fos.write(s.getBytes());
}
catch (IOException e)
{
e.printStackTrace();
}
writeNow = false;
}
}
};
因此,只要writeNow为true,它就会写入File然后将WriteNow设置为false。但是,我意识到这不是正确的方法,因为线程将执行一次然后停止执行。当我尝试使用while(true)和wait()的简单示例时,我发现线程被中断了数百万次。
那么如何在单个线程中包含此事件处理机制,以加快进程?
谢谢!
答案 0 :(得分:1)
您可以尝试以下方法之一:
看起来你正试图让你的作家线程一直在运行;你能做什么只在你需要的时候产生线程。请查看适用于handling expensive operation in the UI thread的Android文档中的示例。
以下是该页面的示例:
public class MyActivity extends Activity {
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[ . . . ]
}
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
mHandler.post(mUpdateResults);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}
一旦你完成写作,你看起来并没有在UI线程中做任何事情,你真的不需要打扰Handler
。但是,您可能希望在文件写入后使用它来显示Toast
。
另一方面,如果您仍希望线程运行,则可能需要sleep()
,并定期唤醒并检查writeNow
的状态。
Thread thread1 = new Thread()
{
public void run()
{
while(true)
{
if(writeNow == true)
{
try
{
fos.write(s.getBytes());
}
catch (IOException e)
{
e.printStackTrace();
}
writeNow = false;
}
try
{
Thread.sleep(100); //sleep for 100 ms
}
catch (InterruptedException e)
{
Log.d('', e.getMessage());
}
}
}
};
请注意,这会很快变得复杂,如果线程在新数据进入并且唤醒时线程处于休眠状态,即使接收到更新的数据并覆盖了之前的字节,也可能会丢失要写入的字节。您需要某种队列来管理它。
我不确定你在使用wait()
做了什么,但这本身也应该有用,实际上是涉及消费者和制作人的问题的方法。我们的想法是让你的线程在共享对象上同步并wait()
(就像你的字节队列一样);当有可写的数据并且唤醒编写器线程时,第二个线程将在共享对象上调用notify()
。然后编写器线程应该编写并重新循环。看看this tutorial。
至于你的线程中断,你的线程可能会因为多种原因而中断,这就是为什么这是一个好习惯(特别是在使用wait()
时)以确保你在之前检查的条件< / em>您呼叫wait()
仍然有效,因为您可能因为拨打notify()/notifyAll()
或因中断而被唤醒。
答案 1 :(得分:0)
Handler handler = null;
handler = new Handler();
//create another class for and make consrtuctor as u want. so that u can use that effectively.
//for example.
popupIndex = new IndexThread(handler,head, target,ltp,price,IndexNifty.this,columsView,call);
popupIndex.setColumnViewexit(columsView);
handler.postDelayed(popupIndex, 300);
//another class
public IntraThread(Handler handler,String script,int target,int ltp,int price,Intraday intraday,TextView columsView,String call){
super();
this.target = target;
this.ltp = ltp;
this.price = price;
this.intraday = intraday;
this.columsView = columsView;
this.script= script;
this.handler= handler;
this.call= call;
}
public void run(){
// write ur code here....
}