1

asmx Web サービスに正常にアクセスしていますが、インターネットがない場合、アプリがクラッシュします。例外を検出して処理するためにあらゆる手段を試みましたが無駄でした。
私のコードとlogcatをチェックしてください。
ログキャット:

10-13 14:22:34.748: W/System.err(275):  at java.lang.Thread.run(Thread.java:1096)
10-13 14:22:34.759: W/dalvikvm(275): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
10-13 14:22:34.858: D/dalvikvm(275): GC_FOR_MALLOC freed 4242 objects / 236920 bytes in 62ms
10-13 14:22:34.858: E/AndroidRuntime(275): FATAL EXCEPTION: AsyncTask #1
10-13 14:22:34.858: E/AndroidRuntime(275): java.lang.RuntimeException: An error occured while executing doInBackground()
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.lang.Thread.run(Thread.java:1096)
10-13 14:22:34.858: E/AndroidRuntime(275): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.View.requestLayout(View.java:8125)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.View.requestLayout(View.java:8125)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.View.requestLayout(View.java:8125)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.View.requestLayout(View.java:8125)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.view.View.requestLayout(View.java:8125)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.widget.TextView.checkForRelayout(TextView.java:5371)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.widget.TextView.setText(TextView.java:2688)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.widget.TextView.setText(TextView.java:2556)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.widget.TextView.setText(TextView.java:2531)
10-13 14:22:34.858: E/AndroidRuntime(275):  at com.bibleverses.BibleverseActivity$ws.doInBackground(BibleverseActivity.java:190)
10-13 14:22:34.858: E/AndroidRuntime(275):  at com.bibleverses.BibleverseActivity$ws.doInBackground(BibleverseActivity.java:1)
10-13 14:22:34.858: E/AndroidRuntime(275):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-13 14:22:34.858: E/AndroidRuntime(275):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-13 14:22:34.858: E/AndroidRuntime(275):  ... 4 more
10-13 14:22:35.158: W/IInputConnectionWrapper(275): showStatusIcon on inactive InputConnection
10-13 14:22:36.009: E/WindowManager(275): Activity com.bibleverses.BibleverseActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f14620 that was originally added here
10-13 14:22:36.009: E/WindowManager(275): android.view.WindowLeaked: Activity com.bibleverses.BibleverseActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f14620 that was originally added here
10-13 14:22:36.009: E/WindowManager(275):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
10-13 14:22:36.009: E/WindowManager(275):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
10-13 14:22:36.009: E/WindowManager(275):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-13 14:22:36.009: E/WindowManager(275):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-13 14:22:36.009: E/WindowManager(275):   at android.app.Dialog.show(Dialog.java:241)
10-13 14:22:36.009: E/WindowManager(275):   at com.bibleverses.BibleverseActivity$ws.onPreExecute(BibleverseActivity.java:240)
10-13 14:22:36.009: E/WindowManager(275):   at android.os.AsyncTask.execute(AsyncTask.java:391)
10-13 14:22:36.009: E/WindowManager(275):   at com.bibleverses.BibleverseActivity$1.onClick(BibleverseActivity.java:107)
10-13 14:22:36.009: E/WindowManager(275):   at android.view.View.performClick(View.java:2408)
10-13 14:22:36.009: E/WindowManager(275):   at android.view.View$PerformClick.run(View.java:8816)
10-13 14:22:36.009: E/WindowManager(275):   at android.os.Handler.handleCallback(Handler.java:587)
10-13 14:22:36.009: E/WindowManager(275):   at android.os.Handler.dispatchMessage(Handler.java:92)
10-13 14:22:36.009: E/WindowManager(275):   at android.os.Looper.loop(Looper.java:123)
10-13 14:22:36.009: E/WindowManager(275):   at android.app.ActivityThread.main(ActivityThread.java:4627)
10-13 14:22:36.009: E/WindowManager(275):   at java.lang.reflect.Method.invokeNative(Native Method)
10-13 14:22:36.009: E/WindowManager(275):   at java.lang.reflect.Method.invoke(Method.java:521)
10-13 14:22:36.009: E/WindowManager(275):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-13 14:22:36.009: E/WindowManager(275):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-13 14:22:36.009: E/WindowManager(275):   at dalvik.system.NativeStart.main(Native Method)
10-13 14:22:40.798: I/Process(275): Sending signal. PID: 275 SIG: 9

コード:

private class ws extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        // try {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        String bk = ed.getText().toString();


        tx1 = (EditText) findViewById(R.id.editText1);
        String Chapter = tx1.getText().toString();
        int chp = Integer.parseInt(Chapter);

        EditText tx2 = (EditText) findViewById(R.id.editText2);
        String verse = tx2.getText().toString();
        int vs = Integer.parseInt(verse);

        //
        //

        request.addProperty("BookTitle", bk);
        request.addProperty("chapter", chp);
        request.addProperty("Verse", vs);

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

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {

            androidHttpTransport.call(SOAP_ACTION, envelope);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tv.setText(e.toString());
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Object result = null;
        try {
            result = (Object) envelope.getResponse();
        } catch (SoapFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String html = result.toString();

        Document doc = Jsoup.parse(html);

        Elements result2 = doc.select("biblewords");
        String result3 = result2.toString();
        String res = Html.fromHtml(result3).toString();



        return res;
    }

    @Override
    protected void onPostExecute(String res) {
        dialog.dismiss();
        tv.setText(res); // txt.setText(result);

    }
4

3 に答える 3

0

doInBackgorund()非 UI スレッドであり、その中の UI 要素にアクセスすることはできません。doInBackground() 内のコードは、レイアウトで定義された UI 要素にアクセスできない別の非 UI スレッドで実行されます。

tv.setText(e.toString());そのため、 doInBackground() 内から UI 要素にアクセスするコード " " を削除し、代わりにonPostExecute()UI スレッドであり、doInBackground() がバックグラウンド処理を終了した後に呼び出される 内に配置します。

于 2012-10-13T13:37:28.380 に答える
0

AsyncTaskスレッドから UI を変更します。通常、Android のメイン スレッド以外の場所から UI を変更することはお勧めできませんが、AsyncTasks の場合は明示的に許可されていません。

onProgressUpdateメイン スレッドへのメッセージを取得し、UI を更新するために使用します。

于 2012-10-13T11:39:50.687 に答える
0

あなたの問題は次の行にあると思います:

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    tv.setText(e.toString());

tv.setText(e.toString());?の行に注目してください。AsyncTask スレッド内で UI 値を設定しています。これは禁止されていると思います。

次のように変更してみてください。

return e.toString();
于 2012-10-13T11:41:10.893 に答える