如何从Android上的库发送进度?

时间:2014-09-05 06:59:40

标签: android eclipse

我有一个项目: myApp
这些文件......
- myFragment .java。
- myDialogFragment .java。
- myAsyncTask .java

我有一个项目: myLibrary
这个项目是“myApp”的“图书馆” 我有...
- myMethodsToUpload .java

其中一种方法,有一个用于在php服务器上写文件的while bucle 一切都像魔术一样! :)
文件结构的原因是使库可重用 但是......

如何将此字段内的值的增量发送到myAsyncTask.java? 考虑到......
我想做的是...制作“myMethodsToUpload.java”,可重复使用。

一些代码......

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

        //...
        //...
    }

}


我已经试过了......
“MyLibrary” - &gt; propeties - &gt; java构建路径 - &gt;项目 - &gt;添加 - &gt;项目(对myApp)
但是...
抛出我的错误:
W / System.err(32469):at java.util.concurrent.FutureTask.run(FutureTask.java:237)... ThreadPoolExecutor.runworker ...

并且,在eclipse的状态栏中出现每一刻“建筑工作空间(X%)”

我是新手,但我认为错误的发生是因为“MyLibrary”是“MyApp”的库,我正在尝试使用“java build path”。
那么......我怎么能解决这个问题?我迷路了!!!

对不起我的英文...提前谢谢! :)

2 个答案:

答案 0 :(得分:1)

这是一个简单的例子:

您的AsyncTask类:

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

您的片段类:

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

编辑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);
                }
            }
        }
    }
}

答案 1 :(得分:0)

我这样做会消耗更多的内存,时间,线程? (我猜)