如何使用intent service和update UI从service上传多个图片



我是android开发人员。当使用intent服务在后台发送多个图像时,我有面部问题ANR。我在Resume()方法上调用了服务。我有更新UI时,一步一步的图片上传完成。我所有的代码在服务,但我不明白为什么我的UI挂。我已经为更新UI创建了ResultReceiver类。请告诉我我做错了什么。

public class UploadImageService extends IntentService {

public static final int STATUS_RUNNING = 0;
public static final int STATUS_FINISHED = 1;
public static final int STATUS_ERROR = 2;
private static final String TAG = "UploadImageService";
public static String SHOW_MSG = "showMsg";
public static String SET_IN_ADAPTER = "setData";
public static String UPLOAD_IMAGE = "uploadImage";
public static String RESULT = "result";
private String threadType, toUser, chatThreadId, gcmRegistrationId, openCloseChatWindowType, recipientName, threadTopicName, attachmentID, attachmentType, currentChunks, originalBase64Img, dateTime, classType, loginUserId;
// Declare Web services variable
private MultipartEntity multipartEntityBuilder;
Database database;
Bundle bundle;
ResultReceiver receiver;
public UploadImageService() {
    super(UploadImageService.class.getName());
}
@Override
protected void onHandleIntent(Intent intent) {

    //initialize database
    database = new Database(UploadImageService.this,  Database.DATABASE_NAME, null, Database.DATABASE_VERSION);
    Log.d(TAG, "Service Started!");
    receiver = intent.getParcelableExtra("receiver");
    try {

        bundle = new Bundle();
        /* Update UI: upload Service is Running */
        //receiver.send(STATUS_RUNNING, Bundle.EMPTY);
        try {
            new UploadThumbImageAsync().execute();
        } catch (Exception e) {
            e.printStackTrace();
            bundle.putString(Intent.EXTRA_TEXT, e.toString());
            receiver.send(STATUS_ERROR, bundle);
        }
       /* new Thread(new Runnable(){
            public void run() {
                // TODO Auto-generated method stub
                while(true)
                {
                    try {
                          new UploadThumbImageAsync().execute();
                    } catch (Exception e) {
                        e.printStackTrace();
                        bundle.putString(Intent.EXTRA_TEXT, e.toString());
                        receiver.send(STATUS_ERROR, bundle);
                    }
                }
            }
        }).start();*/
    } catch (Exception e) {
        e.printStackTrace();
    }
    Log.e(TAG, "Service Stopping!");
    //this.stopSelf();
}
 private class UploadThumbImageAsync extends AsyncTask<String, Void, String> {
    /*this method is use for initializing dialog(ProgressDialog,CustomDialog) and showing*/
    String toUser, comTypeId, threadType, chatThreadId, threadTopicName, chatAttachmentType, chatMessage, thumbBase64AttachmentPath /*original_image*/, loginUserName, recipientName, originalBase64Image, originalFilePath;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //showProgressDialog();
    }
    /*starts the loading of the data in background in doInBackground() method  */
    @Override
    protected String doInBackground(String... params) {
        try {
            toUser = params[0];
            comTypeId = params[1];
            threadType = params[2];
            chatThreadId = params[3];
            threadTopicName = params[4];
            chatAttachmentType = params[5];
            chatMessage = params[6];
            thumbBase64AttachmentPath = params[7];
            loginUserName = params[8];
            recipientName = params[9];
            originalBase64Image = params[10];
            originalFilePath = params[11];
            String url;
            if (!TextUtils.isEmpty(threadType) && threadType.equals(RecentChatList.SIMPLE_TYPE)) {
                url = WS.URL.concat(WS.SAVE_CHAT);
            } else {
                url = WS.URL.concat(WS.GROUP_SAVE_CHAT);
            }
            Log.e(TAG, "url_" + chatMessage + " = " + url);
            String response = HttpClientExecuteMethod.executeMultipartPostMethod(url, multipartEntityBuilder);
            //Log.e(TAG, "save_chat_history_response_" + threadType + "_" + chatMessage + " =" + response);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /*This method is called after the background computation finishes.
        The result of background process in passed in this method as parameters
         and now you can dismiss progress dialog
        and get the result and display on onPostExecute() method
        */
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {
            // Log.e(TAG, "chatAttachmentType = " + chatAttachmentType);
            updateCounter();
            if (result != null) {

                    JSONObject jo = new JSONObject(result);
                    String success = null;
                    final int storeLimit = SharedPreference.getLimit(UploadImageService.this);
                    if (jo.has(WS.SUCCESS)) {
                        success = jo.getString(WS.SUCCESS);
                        if (!TextUtils.isEmpty(success) && success.equals("0")) {
                            return;
                        }
                        if (!TextUtils.isEmpty(success) && success.equals("100")) {
                            callWsSaveChat(chatAttachmentType, chatMessage, thumbBase64AttachmentPath, originalBase64Image, originalFilePath);
                            updateRecentChatAndThreadList();
                            return;
                        }
                        if (!TextUtils.isEmpty(success) && success.equals("99")) {
                            updateRecentChatAndThreadList();
                            return;
                        }

                    }

                    try {
                        ArrayList<Chat> saveChatArrayList = null;
                        if (!TextUtils.isEmpty(success) && success.equals("1")) {
                            saveChatArrayList = new Chat().getChatHistory(UploadImageService.this, result, TAG, "");
                            // Log.e(TAG, "onPostExecute_saveChatArrayList.size = " + saveChatArrayList);
                            ArrayList<Chat> chatHistoryWithoutMsgId = database.getWithoutMsgIdChatHistory(chatThreadId, "#");
                            //Log.e(TAG, "onPostExecute_chatHistoryWithoutMsgId.size = " + chatHistoryWithoutMsgId.size());
                            if (saveChatArrayList != null && !saveChatArrayList.isEmpty() && saveChatArrayList.size() > 0) {
                                for (int i = 0; i < saveChatArrayList.size(); i++) {
                                    final Chat apiChat = saveChatArrayList.get(i);

                                    String apiMsg = apiChat.getMessage();
                                    String apiThumb = null;
                                    if (!TextUtils.isEmpty(apiChat.getAttachment_thumb())) {
                                        apiThumb = apiChat.getAttachment_thumb().concat("$");
                                    }
                                    if (chatHistoryWithoutMsgId != null && !chatHistoryWithoutMsgId.isEmpty() && chatHistoryWithoutMsgId.size() > 0) {
                                        for (int j = 0; j < chatHistoryWithoutMsgId.size(); j++) {
                                            Chat dbChat = chatHistoryWithoutMsgId.get(j);
                                            final String db_message = dbChat.getMessage();

                                            final String db_thumb = dbChat.getAttachment_thumb();
                                                    if (apiThumb.equals(db_thumb)) {
                                                        database.updateChatList(apiChat, result, "#", db_message, db_thumb, loginUserId, toUser, chatThreadId, threadType);

                                                     bundle.putString(RESULT, UPLOAD_IMAGE);
                                                      receiver.send(STATUS_FINISHED, bundle);
                                                        if (!TextUtils.isEmpty(chatAttachmentType) && chatAttachmentType.equals(getResources().getString(R.string.Image))) {
                                                            originalBase64Image = getBase64Image(originalFilePath);
                                                        }
                                                        int subLength = 1024 * 256;
                                                        //Log.e(TAG, "upload_subLength = " + subLength);
                                                        int index = 0;
                                                        int totalChunks = 0;
                                                        if (!TextUtils.isEmpty(originalBase64Image)) {
                                                            for (int k = 0; index < originalBase64Image.length(); k++) {
                                                                index = index + subLength;
                                                                totalChunks++;
                                                            }

                                            database.insertOriginalUploadImageList(apiChat.getAttachment_id(), totalChunks, 0, originalFilePath, chatThreadId, apiChat.getDt_sender_created(), chatAttachmentType);

                                                            // database.deleteAttachmentImageList(originalBase64Image);
                                                            database.deleteAttachmentImageList(originalFilePath);
                                                            UploadOriginalImageList(apiChat.getAttachment_id());
                                                        }
                                                  break;
                                                    } else {
                                                        // Log.e(TAG, "onPostExecute_not_equal_image");
                                                    }
                                                }
                                            }
                                        }
                                    }

                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    // Util.showAlertDialog(mContext, mContext.getResources().getString(R.string.No_internet_connection_available));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "error = " + e.getMessage());
        }
    }

上传更多图片到服务器的方法有很多。可以包括两个库:apache-mime -0.6.jar和httpmime-4.0.1.jar。然后创建您的java主代码:

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class FileUploadTest extends Activity {
private static final int SELECT_FILE1 = 1;
private static final int SELECT_FILE2 = 2;
String selectedPath1 = "NONE";
String selectedPath2 = "NONE";
TextView tv, res;
ProgressDialog progressDialog;
Button b1,b2,b3;
HttpEntity resEntity;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv = (TextView)findViewById(R.id.tv);
    res = (TextView)findViewById(R.id.res);
    tv.setText(tv.getText() + selectedPath1 + "," + selectedPath2);
    b1 = (Button)findViewById(R.id.Button01);
    b2 = (Button)findViewById(R.id.Button02);
    b3 = (Button)findViewById(R.id.upload);
    b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            openGallery(SELECT_FILE1);
        }
    });
    b2.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            openGallery(SELECT_FILE2);
        }
    });
    b3.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!(selectedPath1.trim().equalsIgnoreCase("NONE")) && !(selectedPath2.trim().equalsIgnoreCase("NONE"))){
                progressDialog = ProgressDialog.show(FileUploadTest.this, "", "Uploading files to server.....", false);
                 Thread thread=new Thread(new Runnable(){
                        public void run(){
                            doFileUpload();
                            runOnUiThread(new Runnable(){
                                public void run() {
                                    if(progressDialog.isShowing())
                                        progressDialog.dismiss();
                                }
                            });
                        }
                });
                thread.start();
            }else{
                        Toast.makeText(getApplicationContext(),"Please select two files to upload.", Toast.LENGTH_SHORT).show();
            }
        }
    });
}
public void openGallery(int req_code){
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent,"Select file to upload "), req_code);

}

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Uri selectedImageUri = data.getData();
        if (requestCode == SELECT_FILE1)
        {
            selectedPath1 = getPath(selectedImageUri);
            System.out.println("selectedPath1 : " + selectedPath1);
        }
        if (requestCode == SELECT_FILE2)
        {
            selectedPath2 = getPath(selectedImageUri);
            System.out.println("selectedPath2 : " + selectedPath2);
        }
        tv.setText("Selected File paths : " + selectedPath1 + "," + selectedPath2);
    }
}
public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
private void doFileUpload(){
    File file1 = new File(selectedPath1);
    File file2 = new File(selectedPath2);

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class FileUploadTest extends Activity {
    private static final int SELECT_FILE1 = 1;
    private static final int SELECT_FILE2 = 2;
    String selectedPath1 = "NONE";
    String selectedPath2 = "NONE";
    TextView tv, res;
    ProgressDialog progressDialog;
    Button b1,b2,b3;
    HttpEntity resEntity;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView)findViewById(R.id.tv);
        res = (TextView)findViewById(R.id.res);
        tv.setText(tv.getText() + selectedPath1 + "," + selectedPath2);
        b1 = (Button)findViewById(R.id.Button01);
        b2 = (Button)findViewById(R.id.Button02);
        b3 = (Button)findViewById(R.id.upload);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery(SELECT_FILE1);
            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery(SELECT_FILE2);
            }
        });
        b3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!(selectedPath1.trim().equalsIgnoreCase("NONE")) && !(selectedPath2.trim().equalsIgnoreCase("NONE"))){
                    progressDialog = ProgressDialog.show(FileUploadTest.this, "", "Uploading files to server.....", false);
                     Thread thread=new Thread(new Runnable(){
                            public void run(){
                                doFileUpload();
                                runOnUiThread(new Runnable(){
                                    public void run() {
                                        if(progressDialog.isShowing())
                                            progressDialog.dismiss();
                                    }
                                });
                            }
                    });
                    thread.start();
                }else{
                            Toast.makeText(getApplicationContext(),"Please select two files to upload.", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    public void openGallery(int req_code){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select file to upload "), req_code);
 }

   public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Uri selectedImageUri = data.getData();
            if (requestCode == SELECT_FILE1)
            {
                selectedPath1 = getPath(selectedImageUri);
                System.out.println("selectedPath1 : " + selectedPath1);
            }
            if (requestCode == SELECT_FILE2)
            {
                selectedPath2 = getPath(selectedImageUri);
                System.out.println("selectedPath2 : " + selectedPath2);
            }
            tv.setText("Selected File paths : " + selectedPath1 + "," + selectedPath2);
        }
    }
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    private void doFileUpload(){
        File file1 = new File(selectedPath1);
        File file2 = new File(selectedPath2);
        String urlString = "http://10.0.2.2/upload_test/upload_media_test.php";
        try
        {
             HttpClient client = new DefaultHttpClient();
             HttpPost post = new HttpPost(urlString);
             FileBody bin1 = new FileBody(file1);
             FileBody bin2 = new FileBody(file2);
             MultipartEntity reqEntity = new MultipartEntity();
             reqEntity.addPart("uploadedfile1", bin1);
             reqEntity.addPart("uploadedfile2", bin2);
             reqEntity.addPart("user", new StringBody("User"));
             post.setEntity(reqEntity);
             HttpResponse response = client.execute(post);
             resEntity = response.getEntity();
             final String response_str = EntityUtils.toString(resEntity);
             if (resEntity != null) {
                 Log.i("RESPONSE",response_str);
                 runOnUiThread(new Runnable(){
                        public void run() {
                             try {
                                res.setTextColor(Color.GREEN);
                                res.setText("n Response from server : n " + response_str);
                                Toast.makeText(getApplicationContext(),"Upload Complete. Check the server uploads directory.", Toast.LENGTH_LONG).show();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                           }
                    });
             }
        }
        catch (Exception ex){
             Log.e("Debug", "error: " + ex.getMessage(), ex);
        }
      }
}
现在你的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Multiple File Upload from CoderzHeaven"
    />
<Button
    android:id="@+id/Button01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Get First File">
</Button>
<Button
    android:id="@+id/Button02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Get Second File">
</Button>
<Button
    android:id="@+id/upload"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start Upload">
</Button>
<TextView
    android:id="@+id/tv"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Selected File path : "
    />
<TextView
    android:id="@+id/res"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text=""
   />
</LinearLayout>

当然,要在清单中包含互联网权限:

<uses-permission android:name="android.permission.INTERNET" />

瞧。无论如何,我遵循这个例子在我的情况下:http://www.coderzheaven.com/2011/08/16/how-to-upload-multiple-files-in-one-request-along-with-other-string-parameters-in-android/试着看看那里。上传多个文件有4种方法。看你喜欢哪个