2016-11-25 11 views
0

У меня есть эта настройкаКонтекст активности доступа из управляемого интерфейса

Класс MainActivity создает BTHandler, который является классом полезности. Он передает контекст активности и контекст приложения.

public class MainActivity extends Activity implements View.OnClickListener{ 

    protected void onCreate(Bundle savedInstanceState) { 
    ... 
    currentBT = new BTHandle(this, MainActivity.this); 
    } 

    public Handler handler = new Handler() { 
    @Override 
    public void handleMessage(android.os.Message msg) { 
     ... 
     super.handleMessage(msg); 
    } 
}; 
} 

Это класс Утилии. Он использует оба контекста для некоторых вычислений, и когда требуется создание ConnectThread, для запуска соединения с устройством BT. Он передает контекст активности, поэтому ConnectThread может отправлять сообщение через обработчик.

class BTHandle { 
    private final Context mainActivityContext; 
    private final Activity mainActivity; 
    ... 
    public BTHandle(final Context context, final Activity activity){ 
     mainActivityContext = context; 
     mainActivity = activity; 
    } 
    f(){ 
     ConnectThread connectAsClient = new ConnectThread(mainActivityContext, BTDevice, mBluetoothAdapter, BTUuid); 
     new Thread(connectAsClient).start(); 
    } 

} 

И, наконец, здесь возникает ошибка. Это ConnectThread. Я хочу отправить сообщение отсюда в MainActivity. Но компилятор говорит, что он не справляется с обработчиком. Поэтому я догадываюсь, что контекст не возникает.

public class ConnectThread implements Runnable { 
    private final Context mainActivity; 
    public ConnectThread(Context context, BluetoothDevice device, BluetoothAdapter adapter, UUID BT_UUID) { 
    ... 
    mainActivity = context; 
    } 

    @Override 
    public void run() { 
     ... 
     Message completeMessage = mainActivity.handler.obtainMessage(555, "CONNECTED"); 
     completeMessage.sendToTarget(); 
    } 
} 

Как передать контекст правильно, чтобы ConnectThread мог видеть обработчик?

+0

Какое сообщение об ошибке? Из того, что я вижу, вы пытаетесь ссылаться на обработчик из объекта Context. Ваш 'Handler' является частью вашего' MainActivity' – Stefan

+0

'handler' не является членом класса Context. Если вы хотите получить доступ к этому полю, вам нужно будет направить свою 'mainActivity' в' MainActivity'. –

+0

О, я вижу ошибку. Я неправильно понял. обработчик не является частью класса контекста. @Stefan ошибка: не удается найти обработчик символьной переменной. Итак, как ConnectThread мог видеть обработчик в mainActivity. –

ответ

0

Вы можете либо перейти в MainActivity объект всего пути вниз к ConnectRunnable тому:

private final MainActivity mainActivity; 
public ConnectThread(MainActivity context, BluetoothDevice device, 
BluetoothAdapter adapter, UUID BT_UUID) { 
... 
mainActivity = context; 
} 

Или изменить вызов:

Message completeMessage = 
((MainActivity)(Activity)mainActivity)).handler.obtainMessage(555, "CONNECTED"); 

Кроме того, ваш обработчик обязан утечки памяти. Посмотрите на это для исправления: How to Leak a Context: Handlers & Inner Classes

0

Вы также можете определить общественную и статическую переменную MainActvity и использовать его в другом классе:

public class MainActivity extends Activity implements View.OnClickListener{ 
public static MainActivity mainActivity; 
protected void onCreate(Bundle savedInstanceState) { 
... 
mainActivity = this; 
currentBT = new BTHandle(this, MainActivity.this); 
} 

public Handler handler = new Handler() { 
@Override 
public void handleMessage(android.os.Message msg) { 
    ... 
    super.handleMessage(msg); 
} 
}; 
} 

и в вашем другом классе:

public class ConnectThread implements Runnable { 
private MainActivity mainActivity; 
public ConnectThread(Context context, BluetoothDevice device, BluetoothAdapter adapter, UUID BT_UUID) { 
... 
mainActivity = MainActivity.mainActivity; 
} 

@Override 
public void run() { 
    ... 
    Message completeMessage = mainActivity.handler.obtainMessage(555, "CONNECTED"); 
    completeMessage.sendToTarget(); 
} 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^