arickdev
arickdev

Reputation: 171

How to send Progress from library on Android?

I have a project: myApp
these files...
- myFragment.java.
- myDialogFragment.java.
- myAsyncTask.java

I have a project: myLibrary
This project "is Library" of "myApp"
I have...
- myMethodsToUpload.java

One of these methods, have a While bucle for write the file on php server.
Everything works like magic! :)
and the reason for the file structure is to make the library reusable.
but...

How can I send the increments of a value inside of this While bucle, to myAsyncTask.java?
Considering that...
what I want to do... is to make "myMethodsToUpload.java", reusable.

Some code...

myFragment.java

    myDialogFragment df = new myDialogFragment();
    df.setMyThings(new myAsynctask(), myParameters);
    df.setTargetFragment(this, 0);
    df.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);

.
myDialogFragment.java

public class myDialogFragment extends DialogFragment {

    myAsyncTask async;
    public void setMyThings(myAsynctask inAsynctask, String[] inArray){
        async = inAsynctask;
        async.sendFragment(this);
        parameters = inArray;
    }
    //...  

    //Only called from "myAsyncTask.java"
    public void updateFromAsyncTask(Integer porcent){
        progressbar.setProgress(porcent);
    }
    //...  

}

.
myAsyncTask.java

public class myAsynctask extends AsyncTask<String, Integer, String> {
    void sendFragment(myDialogFrament inFragment){
        myDialogFrament = inFragment;
    }
    //...

    @Override
    protected String doInBackground(String... inArray) {
        String urlPHP = inArray[0];
        String pathImg = inArray[1];
        String paramValue = inArray[2];
        String msj = "";

        try {
            methodsToUpload up = new methodsToUpload(urlPHP);
            up.connectNow();
            up.insertFile(pathImg);
            up.insertParams("pName", paramValue);
            up.insertFinish();
            msj = up.coonectClose();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return msj;
    }

    //Called from "myMethods.java"  
    public void updateFromAsyncTask(int porcent){
        publishProgress(porcent);
    }

    @Override
    protected void onProgressUpdate(Integer... inPorcent) {
        if(myDialogFragment == null){
            return;
        }
        myDialogFragment.updateFromAsyncTask(inPorcent[0]);
    }
}  

.
myMethodsToUpload.java

public class myMethodsToUpload {
    //...  

    public myMethodsToUpload(String url_in){
        this.url = url_in;
    }

    public void insertFile(String path) throws Exception {
        //...
        //...

        while (bytesRead > 0) {
            salidaStream.write(buffer, 0, bufferSize);

            sendedPorcent += bytesRead;
            completedPorcent = (int) (sendedPorcent * 100 / fileSize);

            //This line doesn't work...
            //because myAsyncTask.java, is in another project.
            myAsyncTask.updateFromAsyncTask(completedPorcent);

            bytesAvailable = archivoStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = archivoStream.read(buffer, 0, bufferSize);
         }

        //...
        //...
    }

}

.
I've already tried...
"MyLibrary" -> propeties -> java build path -> projects -> add -> Project(myApp)
but...
throws me errors:
W/System.err(32469): at java.util.concurrent.FutureTask.run(FutureTask.java:237)... ThreadPoolExecutor.runworker...
etc.
And, in the status bar of eclipse appears every moment "Building Workspace (X%)"

I'm a newbie, but I think the error happens because "MyLibrary" is Library of "MyApp", and I'm trying use "java build path".
So... how can I resolve this?, I'm lost!!!

sorry by my english... thanks in advance! :)

Upvotes: 0

Views: 102

Answers (2)

arickdev
arickdev

Reputation: 171

The way that I'm doing this consume more memory, time, threads? (I'm guessing)

Upvotes: 0

An-droid
An-droid

Reputation: 6485

Here is a simple exemple :

Your AsyncTask class :

private CallBack mCallback;

public static interface CallBack {
    public void updateValue(int value);
}

public void setCallBack(CallBack callBack){
    this.mCallBack = callBack;
}

@Override
protected void onProgressUpdate(Integer... inPorcent) {
    mCallback.updateValue(inPorcent[0].intValue());
}

Your fragment class :

public class Fragment extends Fragment implements Callback {

    private AsyncTask yourAsyncTask;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        yourAsyncTask = new AsyncTask();
        yourAsyncTask.setCallBack(this);
        yourAsyncTask.excecute();
    }

   @Override
    public void updateValue(int value){
        Log.e(TAG,"Value : " + value);
    }
}

EDIT 1 :

public class AdsHttpRequest {

    private static final String     TAG     = AdsHttpRequest.class.getSimpleName(); // log
    private GetHttpTask             mGetAsyncTask;
    private static AdsHttpRequest   mInstance;
    private OnGetRequestListener    mCallBack;
    private static final String     SUCCESS = "success";
    private static final String     SUCCES  = "succes";
    private static final String     FAILED  = "fail";

    /**
     * @return a singleton instance of {@link AdsHttpRequest}
     */
    public static AdsHttpRequest getInstance() {
        if (mInstance == null) {
            synchronized (AdsHttpRequest.class) {
                if (mInstance == null) {
                    mInstance = new AdsHttpRequest();
                }
            }
        }
        return mInstance;
    }

    /**
     * Initialize the {@link AsyncTask}, set the callback, execute the task
     * 
     * @param url
     *        url for the request
     * @param callback
     *        {@link OnGetRequestListener} for feed back
     */
    public void post(String url, OnGetRequestListener callback) {
        mCallBack = callback;
        if (mGetAsyncTask == null) {
            mGetAsyncTask = new GetHttpTask();
        } else {
            cancelGetTask();
            mGetAsyncTask = new GetHttpTask();
        }
        mGetAsyncTask.execute(url);
    }

    /**
     * cancel the {@link AsyncTask} if it's still alive <br>
     * <b>see </b> {@link Status}
     */
    public void cancelGetTask() {
        if (mGetAsyncTask != null && mGetAsyncTask.getStatus().equals(Status.RUNNING)) {
            mGetAsyncTask.cancel(true);
        }
        mGetAsyncTask = null;
    }

    private AdsHttpRequest() {
        super();
    }

    /**
     * Actually construct and launch the HTTP request
     * 
     * @param url
     *        url of the request
     * @return response of the server
     */
    private String getResponseFromUrl(String url) {
        String xml = null;
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
        } catch (Exception e) {
            Log.e(TAG, "", e);
        }
        return xml;
    }

    /**
     * Manage the http request in background
     * 
     * @param String
     *        url for the request
     */
    private class GetHttpTask extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... params) {
            if (params[0] != null) {
                return getResponseFromUrl(params[0]); // return the response of the server
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                if (result.contains(SUCCES) || result.contains(SUCCESS)) {
                    mCallBack.onGetRequestResult(SUCCESS);
                } else {
                    mCallBack.onGetRequestResult(FAILED);
                }
            }
        }
    }
}

Upvotes: 1

Related Questions