【问题标题】:Fatal Exception AsyncTask3 error while calling webservice调用 web 服务时出现致命异常 AsyncTask3 错误
【发布时间】:2015-05-01 01:27:07
【问题描述】:

我正在尝试调用 webservice 并将返回值设置为来自服务的 textview。但是当我单击按钮时,我得到了那个致命的异常错误。我的错在哪里?

Java 代码:`

public class Login extends Activity {

private String SOAP_ACTION = "http://appointmentsystem.somee.com/HelloWorld";
private String METHOD_NAME = "HelloWorld";
private String NAMESPACE = "http://appointmentsystem.somee.com/";
private String URL = "http://appointmentsystem.somee.com/Service1.asmx";

private SoapObject request = null;
private SoapSerializationEnvelope envelope;
private HttpTransportSE androidHttpTransport;
private SoapPrimitive response;

private EditText loginEdtUser, loginEdtPassword;
private Button loginBtnEnter;

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

    loginEdtUser = (EditText) findViewById(R.id.loginEdtUser);
    loginEdtPassword = (EditText) findViewById(R.id.loginEdtPassword);
    loginBtnEnter = (Button) findViewById(R.id.loginBtnEnter);

    loginBtnEnter.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            AsyncCallWS task = new AsyncCallWS();
            task.execute();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.login, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        Login();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }

}

public void Login() {
    try {
        request = new SoapObject(NAMESPACE, METHOD_NAME);

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

        androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;

        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            response = (SoapPrimitive) envelope.getResponse();

            loginEdtUser.setText(response.toString());
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
                    Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
                Toast.LENGTH_SHORT).show();
    }

}

错误:

{02-28 11:31:16.935: E/AndroidRuntime(4489): FATAL EXCEPTION: AsyncTask #3
02-28 11:31:16.935: E/AndroidRuntime(4489): Process: oziylmz.randevusistemi, PID: 4489
02-28 11:31:16.935: E/AndroidRuntime(4489): java.lang.RuntimeException: An error occured while executing doInBackground()
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.lang.Thread.run(Thread.java:841)
02-28 11:31:16.935: E/AndroidRuntime(4489): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.os.Handler.<init>(Handler.java:200)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.os.Handler.<init>(Handler.java:114)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.widget.Toast$TN.<init>(Toast.java:351)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.widget.Toast.<init>(Toast.java:101)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.widget.Toast.makeText(Toast.java:265)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at oziylmz.randevusistemi.Login.Login(Login.java:109)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:69)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:1)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
02-28 11:31:16.935: E/AndroidRuntime(4489):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)}

【问题讨论】:

    标签: android eclipse android-asynctask fatal-error


    【解决方案1】:

    你得到以下错误:

     Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    

    这意味着您已尝试在后台更改 UI,因为我看到您的代码您已尝试 Toast 数据捕获 login 方法。

     try {
                androidHttpTransport.call(SOAP_ACTION, envelope);
                response = (SoapPrimitive) envelope.getResponse();
    
                loginEdtUser.setText(response.toString());
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
                        Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
    

    您不能在后台线程中更新UI,您必须处理onPostExecute 中的错误或创建Handler 对象并使用它。

    您可以通过以下方式解决您的问题:

    1- runOnUiThread Example

    2-处理程序

    3- 移至 onPostExecute。

    请参阅以下文章了解更多信息:

    Android background processing with Handlers, AsyncTask and Loaders - Tutorial

    【讨论】:

      【解决方案2】:
       Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
                      Toast.LENGTH_SHORT).show();
      

      这会导致异常,因为您无法在后台处理中触摸 ui 元素。

      修复: 在异步任务的 onPostexecute() 方法中制作 toast,而不是在 UI 线程上执行

      【讨论】:

      • 或者如果你真的不需要的话,你可以简单地评论吐司。
      【解决方案3】:

      你想使用

       runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              Login();
                          }
                   });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多