首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从活动更新IntentService的数据

从活动更新IntentService的数据
EN

Stack Overflow用户
提问于 2016-02-19 19:46:47
回答 1查看 79关注 0票数 1

我有一个上传图像到服务器的IntentService (来源如下)。在上传过程中,用户可能会选择更多要上传的图像。现在,它会产生另一个服务。如何将数据添加到相同的正在运行的服务中,或者在服务未运行时生成新的服务

代码语言:javascript
复制
public class UploadService extends IntentService {

    public static final String TAG = UploadService.class.getSimpleName();

    public static final String ACTION_UPLOAD = UploadService.class.getName() + ".UPLOAD";
    public static final String EXTRA_RESOURCE_ID = "resource_id";
    public static final String EXTRA_RESOURCE_NAME = "resource_name";
    public static final String EXTRA_IMAGES = "images";

    private static final int CONCURRRENT_UPLOAD_COUNT = 3;
    private static final int UPLOAD_STATUS_PENDING = 0;
    private static final int UPLOAD_STATUS_UPLOADING = 1;
    private static final int UPLOAD_STATUS_UPLOADED = 2;
    private static final int UPLOAD_STATUS_FAILED = 3;
    private static final int UPLOAD_STATUS_TERMINATED = 4;

    private ArrayList<DiskImage> mImages = new ArrayList<>();
    private ArrayMap<DiskImage, Integer> mStatusMap = new ArrayMap<>();
    private OkHttpClient mOkHttpClient = new OkHttpClient();

    public UploadService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent.getAction().equals(ACTION_UPLOAD)) {
            String resId = intent.getStringExtra(EXTRA_RESOURCE_ID);
            String resName = intent.getStringExtra(EXTRA_RESOURCE_NAME);
            ArrayList<DiskImage> images = intent.getParcelableArrayListExtra(EXTRA_IMAGES);
            for (DiskImage image : images) {
                image.mUploadId = resId;
                image.mUploadResName = resName;
            }
            mImages.addAll(images);
            upload(); // start the upload
            updateNotification();
        }
    }

    private int getUploadedImageCount() {
        int count = 0;
        for (int i = 0; i < mImages.size(); i++)
            if (getStatus(mImages.get(i)) == UPLOAD_STATUS_UPLOADED)
                count++;
        return count;
    }

    private void updateNotification() {
        UploadNotification.notify(UploadService.this, mImages.size(), getUploadedImageCount());
    }

    private void upload() {
        final DiskImage image = getImageToUpload();
        if (image != null) {
            // show notification
            MediaType mediaType = MediaType.parse(image.mimeType);
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("resource_id", image.mUploadId)
                    .addFormDataPart("resource_name", image.mUploadResName)
                    .addFormDataPart("image", getName(image.path),
                            RequestBody.create(mediaType, new File(image.path)))
                    .build();
            Request request = new Request.Builder()
                    .url(getUploadUrl())
                    .post(requestBody)
                    .build();
            mStatusMap.put(image, UPLOAD_STATUS_UPLOADING);
//            Log.i(TAG, "Uploading image " + getName(image.path));
            mOkHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    mStatusMap.put(image, UPLOAD_STATUS_FAILED);
                    // add failed image in end
                    mImages.remove(image);
                    mImages.add(image);
//                    Log.i(TAG, "Upload failed " + getName(image.path));
                    upload();
                    e.printStackTrace();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
//                    Log.i(TAG, "Uploaded image " + getName(image.path) + " Response: " + response.body().string());
                    mStatusMap.put(image, UPLOAD_STATUS_UPLOADED);
                    upload(); // upload next image
                    updateNotification();
                }
            });
        }
    }

    private String getName(String path) {
        return path.substring(path.lastIndexOf(File.separator) + 1, path.length());
    }

    private DiskImage getImageToUpload() {
        for (int i = 0; i < mImages.size(); i++)
            if (getStatus(mImages.get(i)) == UPLOAD_STATUS_PENDING)
                return mImages.get(i);
        return null;
    }

    private String getUploadUrl() {
        return String.format(Constants.ALBUM_IMAGE_UPLOAD_URL, Preferences.getToken(this));
    }

    private int getStatus(DiskImage image) {
        if (mStatusMap.get(image) == null)
            return UPLOAD_STATUS_PENDING;
        return mStatusMap.get(image);
    }

}
EN

回答 1

Stack Overflow用户

发布于 2016-02-20 01:52:49

难道您不能只使用extend Service (而不是IntentService),将您的活动绑定到服务,然后调用此服务的方法来上传图片吗?

这样,您的服务将一直运行,直到您在服务中调用stopSelf()或在有界活动中调用stopService()。因此,您可以使用同一服务进行多次上传。

请让我知道这个答案是否有帮助...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35504562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档