2012-03-13 25 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 ..; 
    } 
}