在Android SDK中使用蓝牙框架在卸载应用程序时会大大降低系统速度
更新: 我发现,如果我在卸载应用程序之前关闭蓝牙,问题就不再存在了,因此当应用程序退出时,确实有一个资源没有释放 更新2: 以下是eclipse项目,以防有人想尝试testapp: 我构建了一个简单的应用程序,它使用蓝牙从我的电脑接收数据,并将数据显示在文本视图上。该应用程序运行良好,因为我能够在TextView上看到收到的数据。问题是,在卸载应用程序时,系统速度会急剧下降,卸载完成后,系统仍保持不变。当我使用Eclipse上传项目的新版本时,也会发生同样的情况。我导出并签署了应用程序以在发布模式下运行,卸载应用程序时,同样的事情不断发生。我最终不得不重新启动设备。正如我所说,我只是在卸载或升级应用程序时遇到这种情况。我退出并重新启动了几次应用程序,它工作得很好,系统没有减速。可能是分配的系统资源未释放,但我无法找到它。 该设备是三星Galaxy GIO(S5660),搭载2.2版Android,应用程序使用minSdkVersion=“8”编译。我的项目包含以下三个类: BluetoothTestAppActivity.java在Android SDK中使用蓝牙框架在卸载应用程序时会大大降低系统速度,android,bluetooth,android-2.2-froyo,Android,Bluetooth,Android 2.2 Froyo,更新: 我发现,如果我在卸载应用程序之前关闭蓝牙,问题就不再存在了,因此当应用程序退出时,确实有一个资源没有释放 更新2: 以下是eclipse项目,以防有人想尝试testapp: 我构建了一个简单的应用程序,它使用蓝牙从我的电脑接收数据,并将数据显示在文本视图上。该应用程序运行良好,因为我能够在TextView上看到收到的数据。问题是,在卸载应用程序时,系统速度会急剧下降,卸载完成后,系统仍保持不变。当我使用Eclipse上传项目的新版本时,也会发生同样的情况。我导出并签署了应用程序以在发布模
package com.test.bluetoothtestapp;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class BluetoothTestAppActivity extends Activity {
/** Called when the activity is first created. */
private BluetoothServerThread mBtServerThread;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler(){
public void handleMessage(Message msg){
Bundle bundle = msg.getData();
String data = bundle.getString("data");
TextView tv = (TextView)findViewById(R.id.hello);
tv.setText(data);
}
};
// see http://code.google.com/p/android/issues/detail?id=16587 for why we are calling this method on UI thread
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.cancelDiscovery();
mBtServerThread = new BluetoothServerThread(adapter, mHandler,getString(R.string.bt_service_name),
UUID.fromString(getString(R.string.bt_service_uuid)));
mBtServerThread.start();
}
@Override
public void onDestroy(){
super.onDestroy();
try{
if(mBtServerThread != null){
mBtServerThread.cancel();
}
}
catch(Exception ex){
Log.e("BluetoothTestAppActivity Exception", ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.util.Log;
public class BluetoothServerThread extends Thread{
private BluetoothServerSocket mServerSocket;
private String mServiceName;
private UUID mUUID;
private BluetoothAdapter mAdapter;
private BluetoothDataTransferThread mTransferThread;
private Handler mHandler;
public BluetoothServerThread(BluetoothAdapter adapter,Handler handler ,String serviceName, UUID uuid){
mHandler = handler;
mAdapter = adapter;
mServerSocket = null;
mServiceName = serviceName;
mUUID = uuid;
}
public void run(){
BluetoothSocket socket = null;
try{
mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord(mServiceName,mUUID);
socket = mServerSocket.accept();
if(socket != null){
mTransferThread = new BluetoothDataTransferThread(socket, mHandler);
mTransferThread.start();
mServerSocket.close();
}
}
catch(IOException ex){
Log.e("BluetoothServerThread run",ex.getMessage());
}
}
public void cancel(){
try{
if(mTransferThread != null){
mTransferThread.cancel();
}
mServerSocket.close();
}
catch(IOException ex){
Log.e("BluetoothServertThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothServertThread Exception cancel",ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.io.InputStream;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class BluetoothDataTransferThread extends Thread{
private BluetoothSocket mSocket;
private InputStream mInStream;
private Handler mHandler;
public BluetoothDataTransferThread(BluetoothSocket socket, Handler handler){
mHandler = handler;
mSocket = socket;
InputStream tmpIn = null;
try{
tmpIn = mSocket.getInputStream();
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread consructor",ex.getMessage());
}
mInStream = tmpIn;
}
public void run(){
byte[] buffer = new byte[1024];
int count = -1;
while(true){
try{
count = mInStream.read(buffer);
if(count != -1){
String str = new String(buffer, 0, count);
Message msg = Message.obtain(mHandler);
Bundle bundle = new Bundle();
bundle.putString("data", "data read: "+str);
msg.setData(bundle);
msg.sendToTarget();
}
else{
break;
}
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread run",ex.getMessage());
break;
}
}
}
public void cancel(){
try{
mSocket.close();
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread Exception cancel",ex.getMessage());
}
}
}
BluetoothServerThread.java
package com.test.bluetoothtestapp;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class BluetoothTestAppActivity extends Activity {
/** Called when the activity is first created. */
private BluetoothServerThread mBtServerThread;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler(){
public void handleMessage(Message msg){
Bundle bundle = msg.getData();
String data = bundle.getString("data");
TextView tv = (TextView)findViewById(R.id.hello);
tv.setText(data);
}
};
// see http://code.google.com/p/android/issues/detail?id=16587 for why we are calling this method on UI thread
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.cancelDiscovery();
mBtServerThread = new BluetoothServerThread(adapter, mHandler,getString(R.string.bt_service_name),
UUID.fromString(getString(R.string.bt_service_uuid)));
mBtServerThread.start();
}
@Override
public void onDestroy(){
super.onDestroy();
try{
if(mBtServerThread != null){
mBtServerThread.cancel();
}
}
catch(Exception ex){
Log.e("BluetoothTestAppActivity Exception", ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.util.Log;
public class BluetoothServerThread extends Thread{
private BluetoothServerSocket mServerSocket;
private String mServiceName;
private UUID mUUID;
private BluetoothAdapter mAdapter;
private BluetoothDataTransferThread mTransferThread;
private Handler mHandler;
public BluetoothServerThread(BluetoothAdapter adapter,Handler handler ,String serviceName, UUID uuid){
mHandler = handler;
mAdapter = adapter;
mServerSocket = null;
mServiceName = serviceName;
mUUID = uuid;
}
public void run(){
BluetoothSocket socket = null;
try{
mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord(mServiceName,mUUID);
socket = mServerSocket.accept();
if(socket != null){
mTransferThread = new BluetoothDataTransferThread(socket, mHandler);
mTransferThread.start();
mServerSocket.close();
}
}
catch(IOException ex){
Log.e("BluetoothServerThread run",ex.getMessage());
}
}
public void cancel(){
try{
if(mTransferThread != null){
mTransferThread.cancel();
}
mServerSocket.close();
}
catch(IOException ex){
Log.e("BluetoothServertThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothServertThread Exception cancel",ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.io.InputStream;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class BluetoothDataTransferThread extends Thread{
private BluetoothSocket mSocket;
private InputStream mInStream;
private Handler mHandler;
public BluetoothDataTransferThread(BluetoothSocket socket, Handler handler){
mHandler = handler;
mSocket = socket;
InputStream tmpIn = null;
try{
tmpIn = mSocket.getInputStream();
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread consructor",ex.getMessage());
}
mInStream = tmpIn;
}
public void run(){
byte[] buffer = new byte[1024];
int count = -1;
while(true){
try{
count = mInStream.read(buffer);
if(count != -1){
String str = new String(buffer, 0, count);
Message msg = Message.obtain(mHandler);
Bundle bundle = new Bundle();
bundle.putString("data", "data read: "+str);
msg.setData(bundle);
msg.sendToTarget();
}
else{
break;
}
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread run",ex.getMessage());
break;
}
}
}
public void cancel(){
try{
mSocket.close();
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread Exception cancel",ex.getMessage());
}
}
}
BluetoothDataTransferThread.java
package com.test.bluetoothtestapp;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class BluetoothTestAppActivity extends Activity {
/** Called when the activity is first created. */
private BluetoothServerThread mBtServerThread;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler(){
public void handleMessage(Message msg){
Bundle bundle = msg.getData();
String data = bundle.getString("data");
TextView tv = (TextView)findViewById(R.id.hello);
tv.setText(data);
}
};
// see http://code.google.com/p/android/issues/detail?id=16587 for why we are calling this method on UI thread
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.cancelDiscovery();
mBtServerThread = new BluetoothServerThread(adapter, mHandler,getString(R.string.bt_service_name),
UUID.fromString(getString(R.string.bt_service_uuid)));
mBtServerThread.start();
}
@Override
public void onDestroy(){
super.onDestroy();
try{
if(mBtServerThread != null){
mBtServerThread.cancel();
}
}
catch(Exception ex){
Log.e("BluetoothTestAppActivity Exception", ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.util.Log;
public class BluetoothServerThread extends Thread{
private BluetoothServerSocket mServerSocket;
private String mServiceName;
private UUID mUUID;
private BluetoothAdapter mAdapter;
private BluetoothDataTransferThread mTransferThread;
private Handler mHandler;
public BluetoothServerThread(BluetoothAdapter adapter,Handler handler ,String serviceName, UUID uuid){
mHandler = handler;
mAdapter = adapter;
mServerSocket = null;
mServiceName = serviceName;
mUUID = uuid;
}
public void run(){
BluetoothSocket socket = null;
try{
mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord(mServiceName,mUUID);
socket = mServerSocket.accept();
if(socket != null){
mTransferThread = new BluetoothDataTransferThread(socket, mHandler);
mTransferThread.start();
mServerSocket.close();
}
}
catch(IOException ex){
Log.e("BluetoothServerThread run",ex.getMessage());
}
}
public void cancel(){
try{
if(mTransferThread != null){
mTransferThread.cancel();
}
mServerSocket.close();
}
catch(IOException ex){
Log.e("BluetoothServertThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothServertThread Exception cancel",ex.getMessage());
}
}
}
package com.test.bluetoothtestapp;
import java.io.IOException;
import java.io.InputStream;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class BluetoothDataTransferThread extends Thread{
private BluetoothSocket mSocket;
private InputStream mInStream;
private Handler mHandler;
public BluetoothDataTransferThread(BluetoothSocket socket, Handler handler){
mHandler = handler;
mSocket = socket;
InputStream tmpIn = null;
try{
tmpIn = mSocket.getInputStream();
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread consructor",ex.getMessage());
}
mInStream = tmpIn;
}
public void run(){
byte[] buffer = new byte[1024];
int count = -1;
while(true){
try{
count = mInStream.read(buffer);
if(count != -1){
String str = new String(buffer, 0, count);
Message msg = Message.obtain(mHandler);
Bundle bundle = new Bundle();
bundle.putString("data", "data read: "+str);
msg.setData(bundle);
msg.sendToTarget();
}
else{
break;
}
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread run",ex.getMessage());
break;
}
}
}
public void cancel(){
try{
mSocket.close();
}
catch(IOException ex){
Log.e("BluetoothDataTransferThread IOException cancel",ex.getMessage());
}
catch(Exception ex){
Log.e("BluetoothDataTransferThread Exception cancel",ex.getMessage());
}
}
}
我已将BluetoothServerThread.java的运行方法更改如下:
public void run(){
BluetoothSocket socket = null;
try{
mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord(mServiceName,mUUID);
socket = mServerSocket.accept();
if(socket != null){
mServerSocket.close();
socket.close();
}
}
catch(IOException ex){
Log.e("BluetoothServerThread run",ex.getMessage());
}
}
请注意,我将在建立连接后立即关闭连接。在这种情况下,数据传输线程根本没有启动,服务器线程正在退出(我看到它在Eclipse中使用调试模式退出)。因此,不会有任何线程继续运行以阻止或分配任何系统资源,但问题仍然存在
任何帮助都将不胜感激。谢谢您的时间。我倾向于认为您正在创建多个线程。onDestroy不需要在一般生命周期中调用,因此在您的onCreate检查中,查看mBtServerThread是否已经存在并且正在运行线程。如果确实如此,请终止该线程,然后启动另一个线程。无法保证这是正确的,但这是有意义的。您确实看到了退出,但可能有3个打开的线程和1个退出。onCreate将在应用程序中被多次调用,并且ondestroy可能根本不会被调用。当前,这意味着创建多个线程,并销毁最后一个线程(假设在卸载时调用ondestroy)