【问题标题】:Android - Image upload to .net Web service ErrorAndroid - 将图像上传到 .net Web 服务错误
【发布时间】:2013-10-19 13:37:24
【问题描述】:

我创建了以下代码来连接到 .net Web 服务 API 并上传图像。然而,我遇到了一个错误。有人可以解释一下如何解决这个问题吗?

 private static int RESULT_LOAD_IMAGE = 1;
 Button imageLoad, uploadBtn;
 ImageView imageView;
 TextView imagePath, message;
 String imgPath;
 private Bitmap bitmap;
 private ProgressDialog dialog;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageLoad = (Button) findViewById(R.id.buttonLoadPicture);
    uploadBtn = (Button) findViewById(R.id.upload);
    imageView = (ImageView) findViewById(R.id.imgView);
    imagePath = (TextView) findViewById(R.id.imagePath);
    message = (TextView) findViewById(R.id.message);

    imageLoad.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {               
            Intent i = new Intent(
                    Intent.ACTION_PICK,
   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE);               

        }
    });

    uploadBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            dialog = ProgressDialog.show(MainActivity.this, "", "Uploading 
      file...", true);
            new uploadFile().execute();
        }
    });
 }

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        Log.d("Selected image URI", selectedImage.toString());

        String[] filePathColumn = { MediaStore.Images.Media.DATA };
        Log.d("Image Path Column", filePathColumn.toString());

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
        Log.d("Picture Path", picturePath);
        imagePath.setText(picturePath);
        imgPath = picturePath;
        ImageView imageView = (ImageView) findViewById(R.id.imgView);
        imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

    }
 }


 class uploadFile extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {

        Bitmap bm = BitmapFactory.decodeFile(imgPath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] b = baos.toByteArray();

        Log.d("b", b.toString());
        Log.d("baos", baos.toString());


        SoapObject request = new SoapObject("http://tempuri.org/", "sendImage");        
        request.addProperty("myImage", b);

        SoapSerializationEnvelope envelope=new   
     SoapSerializationEnvelope(SoapEnvelope.VER11);
        new MarshalBase64().register(envelope);
        envelope.dotNet = true; 
        envelope.setOutputSoapObject(request);

        try {
            Toast.makeText(getApplicationContext(), "Sending Pic", 
                       Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(), "array length=" + b.length, 
                              Toast.LENGTH_LONG).show();
            HttpTransportSE androidHttpTransport = new 
                  HttpTransportSE("http://www.letstrend.com/spursService.asmx?WSDL");
            androidHttpTransport.call("http://tempuri.org/sendImage", envelope);
            SoapObject result = (SoapObject)envelope.bodyIn;
            Log.d("Soap Response", result.toString());
        } catch (Exception e) {
            e.printStackTrace();            
            Toast.makeText(getApplicationContext(), "in catch e=" + e.getMessage(), 
                  Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(), "fault=" + ((SoapFault) 
                  envelope.bodyIn).faultstring, Toast.LENGTH_LONG).show();
        }

        return null;
    }

 }

LogCat 中显示的错误是

    FATAL EXCEPTION: AsyncTask #1
 java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not 
 called Looper.prepare()
at android.os.Handler.<init>(Handler.java:197)
at android.os.Handler.<init>(Handler.java:111)
at android.widget.Toast$TN.<init>(Toast.java:324)
at android.widget.Toast.<init>(Toast.java:91)
at android.widget.Toast.makeText(Toast.java:238)
atcom.maan.fileuploadbinary.MainActivity$uploadFile.doInBackground(MainActivity.java:150)
atcom.maan.fileuploadbinary.MainActivity$uploadFile.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
... 4 more

和

     Activity com.maan.fileuploadbinary.MainActivity has leaked  windowcom.android.internal.policy.impl.PhoneWindow$DecorView{40cd31e8 V.E..... R.....ID 0,0- 456,144} that was originally android.view.WindowLeaked: 
     Activity com.maan.fileuploadbinary.MainActivity has leaked window    com.android.internal.policy.impl.PhoneWindow$DecorView{40cd31e8 V.E..... R.....ID 0,0-456,144} that was originally added here
     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
 at android.app.Dialog.show(Dialog.java:281)
 at android.app.ProgressDialog.show(ProgressDialog.java:116)
 at android.app.ProgressDialog.show(ProgressDialog.java:99)
 at com.maan.fileuploadbinary.MainActivity$2.onClick(MainActivity.java:71)
 at android.view.View.performClick(View.java:4204)
 at android.view.View$PerformClick.run(View.java:17355)
 at android.os.Handler.handleCallback(Handler.java:725)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:5041)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:511)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
 at dalvik.system.NativeStart.main(Native Method)

谁能告诉我哪里出错了,以便我学习和改正我的错误。

提前致谢。

【问题讨论】:

    标签: android .net web-services android-asynctask android-file


    【解决方案1】:

    不要从 AsyncTask 访问您的 UI 线程,您的 Toast 会尝试访问它。因此,请在 onPostExecute 中创建所有 UI 线程操作,并为该方法提供一些可以使用的东西,例如。一个带有您的位图的对象和一些带有错误的字符串。

    //DEFINE TO RETURN A SOAP OBJECT
    class uploadFile extends AsyncTask<Void, Void, SoapObject> {
    
    
    //DEFINE TO RETURN A SOAP OBJECT
    @Override
    protected SoapObject doInBackground(Void... params) {
    
        Bitmap bm = BitmapFactory.decodeFile(imgPath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] b = baos.toByteArray();
    
        Log.d("b", b.toString());
        Log.d("baos", baos.toString());
    
    
        SoapObject request = new SoapObject("http://tempuri.org/", "sendImage");        
        request.addProperty("myImage", b);
    
        SoapSerializationEnvelope envelope=new   
        SoapSerializationEnvelope(SoapEnvelope.VER11);
        new MarshalBase64().register(envelope);
        envelope.dotNet = true; 
        envelope.setOutputSoapObject(request);
    
        try {
        // ---> THIS IS BAD!!!!
            Toast.makeText(getApplicationContext(), "Sending Pic", 
                       Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(), "array length=" + b.length, 
                              Toast.LENGTH_LONG).show();
       //<------- DELETE IT
    
            HttpTransportSE androidHttpTransport = new 
                  HttpTransportSE("http://www.letstrend.com/spursService.asmx?WSDL");
            androidHttpTransport.call("http://tempuri.org/sendImage", envelope);
            SoapObject result = (SoapObject)envelope.bodyIn;
            Log.d("Soap Response", result.toString());
        } catch (Exception e) {
            e.printStackTrace();  
    
    // ---> THIS IS BAD!!!!      
            Toast.makeText(getApplicationContext(), "in catch e=" + e.getMessage(), 
                  Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(), "fault=" + ((SoapFault) 
                  envelope.bodyIn).faultstring, Toast.LENGTH_LONG).show();
    //<------- DELETE IT
    
        }
        //TRY TO RETURN A MORE PROPRIATE OBJECT LIKE YOUR RESULT! AND HANDLE IT IN onPostExecute
        return result ;
    }
    
    @Override
    onPostExecute(SoapObject result){
    
         if(result == null){
             Toast.makeText(_context, "Something went wrong", Toast.LENGTH_SHORT).show();
             return;
         }
         //HANDLE YOUR RESULT HERE
    
    }
    

    【讨论】:

    • 嗨,A.S.感谢您的回复。能否请您更正编码并寄回给我。我不明白你在说什么......
    • 给你打了个code,不过请看好安卓本子,光抄没有意义,因为下次你用不知道怎么办了!
    • 非常感谢 A.S.我只是一个新手。我会按照你的建议学习安卓书……
    • 抱歉耽误了A.S.
    • @MKD 我同意 A.S.如果您再次遇到类似的问题,简单地复制代码对您未来没有帮助。相反,学习和修改代码;了解每个代码块在做什么,以便您可以学习和创建自定义代码;你会发现你可以更好地调试,因为你会理解代码。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多