0

キューを追跡して後でアップロードするのに苦労しています。アップロード画像は asynctask であり、postexecute では、アップロードされた画像を送信するためにメールが送信されます。

これは私の UploadImage AsyncTask です。私は難しすぎて、今よりずっと簡単にできると思います。

private class UploadImageTask extends AsyncTask<Void, Void, Integer> {
    ProgressDialog dialog;

    /**
     * Private integer which counts how many times we've tried to upload the
     * Image.
     */
    private int _counter = 0;

    private List<String> imageUploadList = new ArrayList<String>();

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if(AppStatus.haveNetworkConnection(_context)){
            if(isPhotoTaken()){
                dialog = new ProgressDialog(Step4.this);
                dialog.setCancelable(false);
                dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                dialog.setMessage(getString(R.string.uploadingMessage));
                dialog.setTitle(getString(R.string.uploadingTitle));
                dialog.show();
            }
        }
    }

    protected Integer doInBackground(Void... params) {
        init();
        postData();
        return null;
    }
    public void init(){
        _counter = 0;
        _beenHere = true;
        for(String path : imageUploadList){
            Debug.out("Path: "+path);
        }
    }
    public void postData() {
        if (isPhotoTaken()) {
            if(AppStatus.haveNetworkConnection(_context)){
                if(_beenHere){
                    ImageUploader.uploadFile(getPhotoPath(),
                            "http://obo.nl/android-upload-image.php", Step4.this);
                } else {
                    for(String path : imageUploadList){
                        Debug.out(path);
                        ImageUploader.uploadFile(path,
                                "http://obo.nl/android-upload-image.php", Step4.this);
                    }
                }
            } else {
                if (_counter == 0) {
                    _counter++;
                    _activity.runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(_context,
                                    getString(R.string.noInternetImageNotUploaded),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                    imageUploadList.add(getPhotoPath());
                }
                try {
                    if(_beenHere){
                        _beenHere = false;
                        goToNextIntent();
                    }
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }               
                postData();
            }
        }
    }

    private void goToNextIntent(){
        Intent intent = new Intent(Step4.this, Step5.class);
        intent.putExtra(EXTRA_MESSAGE, (Serializable) _user);
        intent.putExtra(EXTRA_MESSAGE2, _isRepairable);
        intent.putExtra(EXTRA_MESSAGE3, _injury);
        intent.putExtra(EXTRA_MESSAGE4, _category);
        intent.putExtra(EXTRA_MESSAGE5, _inch);
        intent.putExtra(EXTRA_MESSAGE6, _size);
        startActivity(intent);
    }
    protected void onPostExecute(Integer result) {
        if(isPhotoTaken()){
            if(dialog != null){
                dialog.dismiss();
            }
        }
        mailing(_isRepairable);
        new MyAsyncTask().execute(_mail);
    }
}

この線:

if(AppStatus.haveNetworkConnection(_context))

ユーザーのインターネット接続が機能している場合、ブール値の true を返します。それ以外の場合は false。

私が望むのは、すべての画像パス (およびその後に送信されるメール) を目的の ArrayList にキューに入れて、後でユーザーがインターネットに接続しているときにすべてを送信できるようにすることです。私を助けてください!

4

1 に答える 1

2

画像のパスをリスト (または類似のもの) に保存し、そのリストを保持することができます。たとえば、Shared Preferences で説明します。画像のアップロードが完了すると、そのリストからその画像を削除して次の画像に進み、リストが空になるまで繰り返します。

アップロード中にインターネット接続が切断されても影響はありません。まだアップロードされていない画像のリストが常に保持されています。

Wi-Fi 接続をリッスンするブロードキャスト レシーバーを登録します。接続されると、自動的にアップロードを続行できます。これは単なる提案です。

于 2013-11-04T15:08:34.227 に答える