2016-07-13 7 views
0

私は、AsyncTaskの実行を自動化する方法を見つけようとしています。現在のところ、これはボタンプレスから機能しています。いくつかのコンテキストを与えることアクティビティのAsyncTaskをアプリケーションクラスから実行

-

アプリケーションクラス

// 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); 
    } 
} 

私は、このクラスの内部で、私のApplicationクラスを拡張してきたがハンドラであります私のサービスから送信されたメッセージを読み取る、このハンドラ内でが読み込まれ、適切なケースが選択されます。

私のmessage_readの場合、msg.objはbyte []として保存され、その後Stringとして保存されます。

私の現在のアイデアは、問題のアクティビティが現在実行中であるかどうかを確認した後、何らかの形でAsynTaskを自分のアクティビティ内でアプリケーションクラスハンドラから実行することです。もともと私はこの機能をループ内で動作させていましたが、私のアプリに大きな変更を加えた後、Bluetooth接続サービスが2つのアクティビティで共有されるため、要件が変更されました。

+0

たちはあなたを助けることができるようにあなたのコードのビットを置く方が良いでしょう –

+0

特にあなたがこのの簡単なコード例を与えることができる – sab215

答えて

0

1.createインタフェース

2.Implement活性そのインターフェイス。

3.Then、アプリケーションクラスからのコールバックを行うよりも、アプリケーションクラス

4.Afterに活動からそのインターフェイスを登録

onDestroyでの活動から登録を解除してください

5.Makeまたは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:added –

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サブクラスからアクティビティUIを更新する方法を見つける必要があります。 – sab215

+0

あなたはあなたのUIをAsyncTaskから更新することができます。更新は 'mContext.runOnUiThread(new Runnable(){ { // UiThreadの何かを実行します } }}; –

関連する問題