2012-03-13 79 views
0

如何从内部调用的SensorManager -从AsyncTask调用SensorManager?

protected String doInBackground(String... params) { 
..... 
} 

我必须登录到一个文件acclerometer数据。此应用程序在后台运行。因此我使用AsyncTask来实现它。我需要按下按钮(onClick)来启动和停止日志记录。任何指针都会有帮助!

这是更新...写入的文件是空的...如何开始日志记录?

public class AsyncTaskActivity extends Activity implements SensorEventListener{ 
Button btn; 
File root = Environment.getExternalStorageDirectory(); 
StringBuilder builder = new StringBuilder(); 
File gpxfile = new File(root, "TestFile.txt"); 
String fileText = "Data"; 
FileWriter gpxwriter; 
BufferedWriter out; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    btn = (Button) findViewById(R.id.button1); 
    btn.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      new LongOperation(new AsyncTaskActivity()).execute(""); 
     } 
    }); 
} 




private class LongOperation extends AsyncTask<String, Void, String> { 
    private AsyncTaskActivity mActivity; 
    public LongOperation (AsyncTaskActivity activity) { 
     mActivity = activity; 
    } 
     @Override 
     protected String doInBackground(String... params) { 
      try { 
       gpxwriter = new FileWriter(gpxfile); 
       out = new BufferedWriter(gpxwriter); 
       if (root.canWrite()){ 
        SensorManager manager = (SensorManager)  mActivity.getSystemService(Context.SENSOR_SERVICE); 
        Sensor accelerometer = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
        if(!manager.registerListener((SensorEventListener) this, accelerometer, SensorManager.SENSOR_DELAY_GAME)){        
          System.out.println("Could not start!!!!!!!!!"); 
        } 
        out.write("Start"); 
        out.newLine();         
        out.close(); 
       } 
      } catch (IOException e) { 
       Log.e("doIn","Could not write file " + e.getMessage()); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }    
      return null; 
     }  

     @Override 
     protected void onPostExecute(String result) { 
      TextView txt = (TextView) findViewById(R.id.output); 
      txt.setText("File written successfully!!!"); 
     } 

     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    // TODO Auto-generated method stub 
    builder.setLength(0); 
    builder.append(event.values[0]+","+event.values[1]+","+event.values[2]); 
    try { 
     out.append(builder.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 
+0

@Rajdeep感谢您的帮助。如果可能的话,我对编程新手可以帮助我吗? – Fox 2012-03-13 05:36:54

+0

如果您只在一次性练习中记录传感器的数据,那么'AsynTask'是合理的。但是如果你想不断地在后台获取传感器的数据,那么** Service **是一个更好的选择,再加上一个'HandlerThread'。在这种情况下'AsynTask'不起作用。 – ChuongPham 2013-12-28 17:02:37

回答

0

传递活动实例到的AsyncTask的构造函数,然后访问传感器管理

class MyTask extends AsyncTask<URL, Integer, List> { 
    private MainActivity mActivity; 
    public MyTask(MainActivity activity) { 
     mActivity = activity; 
    } 

    protected List doInBackground(URL... url) { 
     SensorManager mSensorManager = (SensorManager) 
       mActivity.getSystemService(SENSOR_SERVICE) 
     .... 
     return ..; 
    } 
}