如何在Android中使用MultiThreading实现事件处理功能(SensorListeners)

时间:2011-03-07 05:23:51

标签: java android multithreading events sensor

我的Android代码中有一个事件处理机制,用于将传感器值转储到文件中。现在,我在主UI线程中这样做,因此UI按钮响应非常缓慢,我想加快它。

如何在事件处理函数上使用多线程?我试着这样做:

  1. 创建一个全局变量writeNow。
  2. 当传感器值更改时,设置WriteNow = true
  3. 在类中创建一个如下所示的线程:

    Thread thread1 = new Thread()  
    {  
      public void run()  
      {  
        if(writeNow == true)  
          {  
            try 
            {  
                fos.write(s.getBytes());  
            } 
            catch (IOException e) 
            {  
                 e.printStackTrace();  
            }  
            writeNow = false;  
          }  
      }  
     };  
    
  4. 因此,只要writeNow为true,它就会写入File然后将WriteNow设置为false。但是,我意识到这不是正确的方法,因为线程将执行一次然后停止执行。当我尝试使用while(true)和wait()的简单示例时,我发现线程被中断了数百万次。

    那么如何在单个线程中包含此事件处理机制,以加快进程?

    谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法之一:

  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

  2. 另一方面,如果您仍希望线程运行,则可能需要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());  
                }  
            }
        }  
     }; 
    

    请注意,这会很快变得复杂,如果线程在新数据进入并且唤醒时线程处于休眠状态,即使接收到更新的数据并覆盖了之前的字节,也可能会丢失要写入的字节。您需要某种队列来管理它。

  3. 我不确定你在使用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....
}