2015-05-08 3 views
0

Я создал AsyncTask. Я хочу соединиться с Bluetooth-устройством, и только после сопряжения он должен перейти к следующему действию. Мой код:Android Async не работает

public class YourTask extends AsyncTask<String, Void, Void> 
{ 
    public BluetoothDevice d; 
    @Override 
    protected Void doInBackground(String... urls) 
    { 
     //pairDevice(d); 
     return null; 
    } 
    public void onPreExecute() 
    { 
     pairDevice(d); 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     Context context = getApplicationContext(); 

     int duration = Toast.LENGTH_SHORT; 
     CharSequence text = "Pairing"; 
     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
     startActivity(new Intent(NewDeviceActivity.this,DevicesActivity.class)); 
     finish(); 
    } 
} 
void pairDevice(BluetoothDevice device) { 
    try { 

     Method m = device.getClass() 
       .getMethod("createBond", (Class[]) null); 
     m.invoke(device, (Object[]) null); 
    } catch (Exception e) { 
     Log.e(TAG, e.getMessage()); 
    } 

} 

Функция onPostExecute выполняется даже до завершения функции pairDevice. Пожалуйста, помогите

+1

переместите вызов метода 'pairDevice' внутри' doInBackground', и он должен работать. И также инициализируйте ссылку '' BluetoothDevice''. В настоящее время у вас есть 'refrence' of' BluetoothDevice', а не объект 'BluetoothDevice' – BBdev

ответ

0

Метод onPostExecute() запускается после выполнения задач в doInBackground(). В вашем примере вы не выполняете никаких заданий в doInBackground(), в результате чего вызываются onPostExecute(). Переместите свой метод pairDevice(BluetoothDevice device) в метод doInBackground() и он должен работать.

+0

, параDevice открывает еще один поток, и он не ждет, пока другой поток завершит –

0

Фон Длинные операции должны выполняться только в doInBackground методе. Это фактический поток.

@Override 
public void onPreExecute() 
    { 
     // this executes before Background operation starts 
     // here you can start showing ProgressBar to let the users know that it's still doing the work and you can dismiss in onPostExecute 
    } 

@Override 
    protected Void doInBackground(String... urls) 
    { 
     // here you should do the long operation 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void result) 
    { 
     // here you can update the UI or move to other activity after long task has been done 
    } 

Проблема заключается в том, вы пытаетесь запустить операцию фона в onPreExecute.

public void onPreExecute() 
{ 
     pairDevice(d); 
} 

Просто переместите метод pairDevice(d) к doInBackground методе, который не является правильным.

+0

, параDevice открывает другой поток, и он не ждет другого резьба до конца –

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