在Android SDK中使用蓝牙框架在卸载应用程序时会大大降低系统速度

在Android SDK中使用蓝牙框架在卸载应用程序时会大大降低系统速度,android,bluetooth,android-2.2-froyo,Android,Bluetooth,Android 2.2 Froyo,更新: 我发现,如果我在卸载应用程序之前关闭蓝牙,问题就不再存在了,因此当应用程序退出时,确实有一个资源没有释放 更新2: 以下是eclipse项目,以防有人想尝试testapp: 我构建了一个简单的应用程序,它使用蓝牙从我的电脑接收数据,并将数据显示在文本视图上。该应用程序运行良好,因为我能够在TextView上看到收到的数据。问题是,在卸载应用程序时,系统速度会急剧下降,卸载完成后,系统仍保持不变。当我使用Eclipse上传项目的新版本时,也会发生同样的情况。我导出并签署了应用程序以在发布模

更新: 我发现,如果我在卸载应用程序之前关闭蓝牙,问题就不再存在了,因此当应用程序退出时,确实有一个资源没有释放

更新2: 以下是eclipse项目,以防有人想尝试testapp:

我构建了一个简单的应用程序,它使用蓝牙从我的电脑接收数据,并将数据显示在文本视图上。该应用程序运行良好,因为我能够在TextView上看到收到的数据。问题是,在卸载应用程序时,系统速度会急剧下降,卸载完成后,系统仍保持不变。当我使用Eclipse上传项目的新版本时,也会发生同样的情况。我导出并签署了应用程序以在发布模式下运行,卸载应用程序时,同样的事情不断发生。我最终不得不重新启动设备。正如我所说,我只是在卸载或升级应用程序时遇到这种情况。我退出并重新启动了几次应用程序,它工作得很好,系统没有减速。可能是分配的系统资源未释放,但我无法找到它。 该设备是三星Galaxy GIO(S5660),搭载2.2版Android,应用程序使用minSdkVersion=“8”编译。我的项目包含以下三个类:

BluetoothTestAppActivity.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

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)