ADK toolkit Android+Arduino store variable issue

82 Views Asked by At

I'm writing a program which is supposed to run "forever". The program is Android application for tablet which exchanges data with Arduino. I have already implemented the code for Arduino and Android, and it exchanges data very well. However, after 2 cycles of work, my instance of AdkManager becomes NULL. As I've read before, Android will null variables from time to time because it has limited resources. However here's the problem - the AdkManager has confirmed bug that once it has been closed, it can't be reopened. Thus I can't re-initiate the AdkManager instance and I need to store it somehow. So far I've been using Application extension. The code is below:

MyApplication:

package org.udoo.androidadkdemobidirect;

import android.app.Application;
import android.content.Context;
import android.hardware.usb.UsbManager;

import me.palazzetti.adktoolkit.AdkManager;

/**
 * Created by admin on 8/18/16.
 */
public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

    public void setSomeVariable(String someVariable) {
        this.someVariable = someVariable;
    }

    public static class sAdkManager{
        private static sAdkManager ourInstance = null;

        public static sAdkManager getInstance() {
            if (ourInstance==null)
                ourInstance = new sAdkManager();
            return ourInstance;
        }

        private static AdkManager mAdkManager = null;


        public void write(String s){
            mAdkManager.writeSerial(s);
        }
        public String read(){
            return mAdkManager.readSerial();
        }

        public void open(){
            mAdkManager.open();
        }

        public void close(){
            mAdkManager.close();
        }

        public boolean checkNull(){
            return mAdkManager==null;
        }
        public static void init(Context context){
            if(mAdkManager==null) {
                mAdkManager = new AdkManager((UsbManager) context.getSystemService(Context.USB_SERVICE));
                context.registerReceiver(mAdkManager.getUsbReceiver(), mAdkManager.getDetachedFilter());
            }
        }
        private sAdkManager() {
        }
    }
}

MainActivity:

package org.udoo.androidadkdemobidirect;

import me.palazzetti.adktoolkit.AdkManager;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.usb.UsbManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.TextView;
import android.widget.ToggleButton;
//import org.udoo.androidadkdemobidirect.sAdkManager;

public class MainActivity extends Activity{

//  private static final String TAG = "UDOO_AndroidADKFULL";     

    private static String mAdkManager=null;

    private ToggleButton buttonLED;
    private TextView distance;
    private AdkReadTask mAdkReadTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


//
////        register a BroadcastReceiver to catch UsbManager.ACTION_USB_ACCESSORY_DETACHED action
//      registerReceiver(mAdkManager.getUsbReceiver(), mAdkManager.getDetachedFilter());

        buttonLED = (ToggleButton) findViewById(R.id.toggleButtonLed);
        distance  = (TextView) findViewById(R.id.textViewIntro);
//      mAdkManager.open();
        TextView tv = (TextView) findViewById(R.id.ppm);
        if (mAdkManager==null){
            tv.setText("ADK is null. init()");
            mAdkManager = new String ("sometext");

        }
        else{
            tv.setText("ADK is not null.");
        }
        if (MyApplication.sAdkManager.getInstance().checkNull()) {
            distance.setText("Null before init");
            MyApplication.sAdkManager.init(this);

        }

        if (MyApplication.sAdkManager.getInstance().checkNull()) {
            distance.setText("Null after init");
        }
        MyApplication.sAdkManager.getInstance().open();
        mAdkReadTask = new AdkReadTask();
        mAdkReadTask.execute();
    }

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

    }

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

    }

    @Override
    public void onDestroy() {
        MyApplication.sAdkManager.getInstance().close();


    //  unregisterReceiver(mAdkManager.getUsbReceiver());

        super.onDestroy();
    }

    // ToggleButton method - send message to SAM3X
    public void blinkLED(View v){
        if (buttonLED.isChecked()) {
            TextView tvdbg = (TextView) findViewById(R.id.ppm);
            tvdbg.setText("send 1");
            // writeSerial() allows you to write a single char or a String object.
            //mAdkManager.writeSerial("1");
            MyApplication.sAdkManager.getInstance().write("1");
//          mAdkManager.writeSerial("8");
        } else {
            //mAdkManager.writeSerial("0");
            MyApplication.sAdkManager.getInstance().write("0");
        }
    }

    /* 
     * We put the readSerial() method in an AsyncTask to run the 
     * continuous read task out of the UI main thread
     */
    private class AdkReadTask extends AsyncTask<Void, String, Void> {

        private boolean running = true;

        public void pause(){
            running = false;
        }

        protected Void doInBackground(Void... params) {
//          Log.i("ADK demo bi", "start adkreadtask");
            while(running) {
//              if (mAdkManager.serialAvailable())
//                  publishProgress(mAdkManager.readSerial()) ;
                publishProgress(MyApplication.sAdkManager.getInstance().read());
            }
            return null;
        }

        protected void onProgressUpdate(String... progress) {
            distance.setText("You put "+((int)progress[0].charAt(0)-48) + " iqos butts\tRFID OK");
            next();
//          Log.i(TAG, "received: " + (int)progress[0].charAt(0));
        }  
    }

    private void next() {
        final Intent intent = new Intent(this, BRActivity.class );

        new android.os.Handler().postDelayed(
                new Runnable() {
                    public void run() {
                        mAdkReadTask.pause();
                        mAdkReadTask = null;
                        startActivity(intent);
                    }
                },
                3000);
    }

}

There are just 2 Activities for now - MainActivity and BRActivity. BRActivity is just a view with "return" button which comes back to MainActivity.

Also what I find interesting - I output the readSerial in TextView to see what I got in reader thread. However on cycle#2 i don't get any output to TextView, but Activity still changes to the next one.

[EDIT]

Apparently the problem was solved when the thread was nulling. However, I still don't get the text update, but I magically get to another screen. Please advice.

0

There are 0 best solutions below