0

我很难跟踪我的队列并在稍后上传它们。上传图片是一个异步任务,在 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))

如果用户有可用的 Internet 连接,则返回布尔值 true。否则为假。

我想要的是在所需的 ArrayList 中将所有图像路径(以及之后发送的邮件)排队,这样我就可以在用户有工作的互联网连接时将它们全部发送。请帮帮我!

4

1 回答 1

2

您可以将图像路径存储在列表(或类似的东西)中并保留该列表,比如说在共享首选项中。上传完一张图片后,您将从该列表中删除它并继续下一张,依此类推,直到您的列表为空。

上传时,如果互联网连接中断,它不会影响您,您将始终保留仍待上传的图像列表。

注册一个广播接收器来监听 wi-fi 连接,当它连接时它可以自动继续上传 - 这只是一个建议。

于 2013-11-04T15:08:34.227 回答