2013-10-15 2 views
0

문자열 값 "1"또는 "-1"을 반환하는 webservice가 있지만 문자열에 있습니다.문자열을 org.ksoap2.serialization.SoapPrimitive로 캐스팅 할 수 없습니다.

내가 org.ksoap2.serialization.SoapPrimitive하는 문자열에서 캐스팅 할 수 Asunc 작업을 사용하여 오류가

전체 AsuncTask 클래스 코드 :

public class LoginAsync extends AsyncTask<Void, Void, String> { 

Activity mActivity; 
Context context; 

ProgressDialog progressDialog; 

public LoginAsync(Activity activity, ProgressDialog progressDialog, 
     Context context) { 
    super(); 
    this.progressDialog = progressDialog; 
    this.mActivity = activity; 
    this.context = context; 
} 

@Override 
protected String doInBackground(Void... voids) { 
    SoapPrimitive resultRequestSOAP = null; 

    try { 
     final String NAMESPACE = "http://ws.sams.com"; 
     final String URL = "http://sams-app.com:8080/webService/services/LoginActvityWs?WSDL"; // usint 
                           // // 
                           // // 
                           // // 
                           // localhost 
     final String METHOD_NAME = "login"; 
     final String SOAP_ACTION = "http://ws.sams.com/login"; 

     SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(context); 
     String user = prefs.getString("login1", "0"); 
     String pass = prefs.getString("password1", "0"); 
     // Calling Login Method 
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     // First Reques for USER NAME . 
     PropertyInfo pi = new PropertyInfo(); 
     pi.setName("username"); 
     pi.setValue(user); 
     pi.setType(String.class); 
     request.addProperty(pi); 

     // Second Reques for USER NAME . 
     PropertyInfo pi2 = new PropertyInfo(); 
     pi2.setName("password"); 
     pi2.setValue(pass); 
     pi2.setType(String.class); 
     request.addProperty(pi2); 

     // Getting Request Result , Will get TID . 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(request); 

     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

     androidHttpTransport.call(SOAP_ACTION, envelope); 
     resultRequestSOAP = (SoapPrimitive) envelope.getResponse(); 

     return String.valueOf(resultRequestSOAP); 

    } 

    catch (SocketTimeoutException e) { 
     return "error"; 

    } 

    catch (ConnectTimeoutException e) { 
     return "error"; 

    } 

    catch (XmlPullParserException e) { 

     return "error"; 

    } catch (IOException e) { 

     return "error"; 
    } 

    catch (NullPointerException e) { 

     return "error"; 

    } 

} 

@Override 
protected void onPostExecute(String result) { 

    // If any error oceeared duaring get TID 
    if (result.equalsIgnoreCase("error")) { 
     final AlertDialog.Builder alertDialog = new AlertDialog.Builder(
       mActivity); 

     alertDialog.setTitle("يوجد مشكلة بالاتصال او السيرفر"); 
     alertDialog.setMessage("هل تود المحاولة مجددا ؟ "); 
     // Retry Button Action 
     alertDialog.setPositiveButton("نعم", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         LoginAsync asynTask = new LoginAsync(mActivity, 
           progressDialog, mActivity 
             .getApplicationContext()); 
         asynTask.execute(); 
        } 
       }); 

     // No Button Action 
     alertDialog.setNegativeButton("لا", 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         progressDialog.dismiss(); 
        } 
       }); 

     alertDialog.show(); 

    } 
    // IF pass or user Filed . 
    else if (Integer.parseInt(result.toString()) == -1) { 

     final AlertDialog.Builder alertDialog = new AlertDialog.Builder(
       mActivity); 

     alertDialog.setTitle("اسم المستخدم او كلمة المرور خاطئة"); 
     alertDialog.setMessage("هل تود اعادة تسجيل الدخول "); 

     alertDialog.setPositiveButton("نعم", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 

         progressDialog.dismiss(); 

        } 
       }); 
     alertDialog.setNegativeButton("لا", 
       new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         progressDialog.dismiss(); 
         Toast.makeText(mActivity.getApplicationContext(), 
           "thank you for using SAMS app", 
           Toast.LENGTH_LONG).show(); 
         mActivity.finish(); 
        } 
       }); 

     alertDialog.show(); 

    } 

    else if (Integer.parseInt(result.toString()) == 0) { 

     SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(context); 
     prefs.edit().putInt("TID", Integer.parseInt(result.toString())) 
       .commit(); 

     Toast.makeText(mActivity.getApplicationContext(), 
       result.toString(), Toast.LENGTH_LONG).show(); 

     GetClassesListAsync asynTask = new GetClassesListAsync(mActivity, 
       progressDialog, context); 
     asynTask.execute(); 

    } 

    // For correct Login ! 
    else { 
     progressDialog.dismiss(); 
     if (Integer.parseInt(result.toString()) >= 1) { 

      SharedPreferences prefs = PreferenceManager 
        .getDefaultSharedPreferences(context); 
      prefs.edit().putInt("TID", Integer.parseInt(result.toString())) 
        .commit(); 

      Intent intent1 = new Intent(context, DashBoard.class); 
      mActivity.startActivity(intent1); 

     } 
    } 

} 
} 

전체 로그인 오류 :

 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$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to  org.ksoap2.serialization.SoapPrimitive 
at com.app.sams.LoginAsync.doInBackground(LoginAsync.java:82) 
at com.app.sams.LoginAsync.doInBackground(LoginAsync.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
... 5 more 

답변

7

한 번 이런 일이 생겼습니다. SoapPrimitive에서 Object로 변경 한 다음 캐스팅했습니다. 그러니 한번 사용해보십시오. 이것은 관련이 없지만 dotnet에서 웹 서비스를 작성하는 경우 envelope.dotnet = true를 사용하여 봉투에서 지정해야합니다.

4

나는 같은 문제가있어서 Jacky Nguyen이 말한 것처럼 해결했습니다.
여기 예가 도움이되기를 바랍니다!

바꾸기
// SoapPrimitive resultRequestSOAP = null;
by
Object resultRequestSOAP = null;

및 바꾸기

// resultRequestSOAP = (SoapPrimitive) envelope.getResponse();
by
resultRequestSOAP = (Object) envelope.getResponse();

+0

나는 감사 – jasonflaherty

0
SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 
    string result = response.toString(); 
+0

당신이 제공하는 솔루션에 대해 좀 더 설명을 추가 더 답변을 정교 시겠어요 ... 원시에 정반대 ... 객체를해야했다? – abarisone

+1

코드를 다음과 같이 변경할 수 있습니다. resultRequestSOAP = (SoapPrimitive) envelope.getResponse(); return (resultRequestSOAP) .toString(); – unalCTR

관련 문제