2016-07-13 2 views
0

Я пытаюсь найти способ автоматизировать выполнение AsyncTask, в настоящее время он работает от нажатия кнопки.Выполнение AsyncTask из класса приложения

Чтобы дать некоторый контекст -

Класс Application

// The Handler that gets information back from the BluetoothService 
public final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) {     
      case MESSAGE_READ: 
       Log.d(TAG, "MESSAGE_READ"); 
       byte[] readBuf = (byte[]) msg.obj; 
       readMessage = new String(readBuf); 
       break; 
     } 
    } 
}; 

активность - AsyncTask Подкласс

private class PostTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     readBuf = ((MyApplication) getApplication()).getReadBuf(); 
     speedcur1 = speedometer.getCurrentSpeed(); 
     speedcur2 = speedometer1.getCurrentSpeed(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     if (readBuf.startsWith("V")) { 
      readBuf = readBuf.replace("V", ""); 
      String[] parts = readBuf.split(","); 
      String part1 = parts[0]; 
      String part2 = parts[1]; 
      speed1 = Float.parseFloat(part1); 
      speed2 = Float.parseFloat(part2); 
      finalspeed1 = ((speed1 * 102)/100); 
      finalspeed2 = ((speed2 * 602)/100); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     speedometer.onSpeedChanged(speedometer.getCurrentSpeed() - speedcur1); 
     speedometer.onSpeedChanged(speedometer.getCurrentSpeed() + finalspeed1); 
     speedometer1.onSpeedChanged(speedometer1.getCurrentSpeed() - speedcur2); 
     speedometer1.onSpeedChanged(speedometer1.getCurrentSpeed() + finalspeed2); 
     myLabel.setText(readBuf); 
    } 
} 

я продлил свой класс приложений, в этом классе является обработчиком который считывает сообщения, отправленные с моей службы, msg.arg1 считывается внутри этого обработчика и выбирает соответствующий регистр.

В моем случае message_read msg.obj сохраняется как байт [], а затем сохраняется как строка.

Моя нынешняя идея - каким-то образом выполнить AsynTask внутри моей активности из обработчика класса приложения после проверки того, выполняется ли текущая активность. Первоначально у меня была эта функциональность, работающая внутри цикла, но после внесения огромных изменений в мое приложение требования изменились, поскольку служба соединения Bluetooth разделена между двумя действиями.

+0

Было бы лучше, чтобы положить немного кода, так что мы можем помочь вам –

+0

сделать, оставил некоторые из несвойственных кода, особенно в обработчике – sab215

ответ

0

1.Create интерфейс

2.Implement, что интерфейс активности.

3.Then, зарегистрировать этот интерфейс от деятельности в классе приложения

4.После сделать обратный вызов из класса приложения

5.Make обязательно разрегистрировать от деятельности в OnDestroy или OnStop

public class ApplicationClass extends Appliation{ 

    private static ApplicationClass instance; 
    private TestInterface mCallBack; 

    public final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) {     
      case MESSAGE_READ: 
       if(mCallBack!=null){ 
        mCallBack.doSomething(); 
       } 
       break; 
     } 
    } 
}; 


    public void onCreate(){ 
     instance = this; 
    } 


    public ApplicationClass getInstance(){ 
     return instance; 
    } 

    public void register(TestInterface callBack){ 
     mCallBack = callBack; 
    } 

    public void unRegister(){ 
     mCallBack = null; 
    } 



} 

public interface TestInterface{ 

    void doSomething(); 

} 

public class MainActivity extends Activity implements TestInterface{ 

    @Override 
    public void doSomething(){ 

    } 

    @Override 
    public void onStop(){ 
    ApplicationClass.getInstance().unRegister(); 
    } 

    @Override 
    public void onStart(){ 
    ApplicationClass.getInstance().register(this); 
    } 

} 
+0

Не могли бы вы дать краткий пример кода этого пожалуйста ? – sab215

+0

@ sab215: добавлено –

1

Да, вы можете запустить AsyncTask из класса приложения и проверить в соответствии с вашей логикой для запуска или нет?

public class BaseJuiceApplication extends Application { 

     public static BaseJuiceApplication instance = null; 

     public static Context getInstance() { 
      if (null == instance) { 
       instance = new BaseJuiceApplication(); 
      } 
      return instance; 
     } 

     @Override 
     public void onCreate() { 
      super.onCreate(); 

      if(getPrefs.getBoolean("MyKKey")){ 
       // any of your logic 
       new LongOperation().execute(""); 
       } 

     } 

    private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
     } 

     @Override 
     protected void onPreExecute() {} 

    } 
    } 
} 
+0

AsyncTask находится в моей деятельности прямо сейчас, а не в классе приложения, хотя это может быть другой вариант. Мне нужно будет найти способ обновить пользовательский интерфейс активности из подкласса AsyncTask класса Application. – sab215

+0

вы можете обновить пользовательский интерфейс от AsyncTask только пользовательский интерфейс обновление будет инкапсулировать в 'mContext.runOnUiThread (новый Runnable() { общественного недействительными запуска() {// делать что-то на UiThread } });' –