java – android.view.ViewRoot $CalledFromWrongThreadException:

我在logcat中收到错误说明:

java.net.UnknownHostException: apps.example.com
09-13 14:57:28.970: W/System.err(3823): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

谁看过这个吗?我不确定究竟是什么导致了这个问题.

完整的LOGCAT:

09-13 14:57:27.085: D/dalvikvm(3823): GC_EXTERNAL_ALLOC freed 46K, 43% free 3084K/5379K, external 0K/0K, paused 77ms
09-13 14:57:27.165: D/dalvikvm(3823): GC_EXTERNAL_ALLOC freed 1K, 43% free 3084K/5379K, external 1K/513K, paused 71ms
09-13 14:57:27.285: D/dalvikvm(3823): GC_EXTERNAL_ALLOC freed 5K, 43% free 3091K/5379K, external 2167K/2538K, paused 64ms
09-13 14:57:27.290: I/System.out(3823): Sim State5
09-13 14:57:27.300: D/Network Availability(3823): CONNECTED
09-13 14:57:27.300: D/Network Availability(3823): NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
09-13 14:57:27.375: D/CLIPBOARD(3823): Hide Clipboard dialog at Starting input: finished by someone else... !
09-13 14:57:28.765: D/MDN(3823): 3055861092
09-13 14:57:28.770: I/System.out(3823): MDN%1234 = 768
09-13 14:57:28.770: I/System.out(3823): MDN/1234 = 2476386
09-13 14:57:28.770: D/ICCID(3823): 8901260832120867967
09-13 14:57:28.770: I/System.out(3823): ICCID%1234 = 587
09-13 14:57:28.770: I/System.out(3823): ICCID/1234 = 7213339410146570
09-13 14:57:28.815: D/dalvikvm(3823): GC_EXTERNAL_ALLOC freed 20K, 42% free 3129K/5379K, external 2664K/3205K, paused 38ms
09-13 14:57:28.855: I/url...(3823): https://apps.example.com/REST/phoneSettings
09-13 14:57:28.885: V/httpPost(3823): org.apache.http.client.methods.HttpPost@40538058
09-13 14:57:28.970: E/DataSettings(3823): java.net.UnknownHostException: apps.example.com
09-13 14:57:28.970: W/System.err(3823): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
09-13 14:57:28.970: W/System.err(3823):     at android.view.ViewRoot.checkThread(ViewRoot.java:3088)
09-13 14:57:28.970: W/System.err(3823):     at android.view.ViewRoot.requestLayout(ViewRoot.java:669)
09-13 14:57:28.970: W/System.err(3823):     at android.view.View.requestLayout(View.java:8406)
09-13 14:57:28.980: W/System.err(3823):     at android.view.View.requestLayout(View.java:8406)
09-13 14:57:28.980: W/System.err(3823):     at android.view.ViewGroup.removeAllViews(ViewGroup.java:2261)
09-13 14:57:28.980: W/System.err(3823):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:213)
09-13 14:57:28.980: W/System.err(3823):     at android.app.Activity.setContentView(Activity.java:1663)
09-13 14:57:28.980: W/System.err(3823):     at com.project.example.app.UpdateActivity.tryagain(UpdateActivity.java:654)
09-13 14:57:28.980: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.getQueryResults(UpdateActivity.java:569)
09-13 14:57:28.980: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:382)
09-13 14:57:28.980: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:1)
09-13 14:57:28.980: W/System.err(3823):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-13 14:57:28.980: W/System.err(3823):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
09-13 14:57:28.980: W/System.err(3823):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
09-13 14:57:28.980: W/System.err(3823):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
09-13 14:57:28.980: W/System.err(3823):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
09-13 14:57:28.980: W/System.err(3823):     at java.lang.Thread.run(Thread.java:1019)
09-13 14:57:34.089: V/In the parser(3823): now
09-13 14:57:34.089: W/System.err(3823): org.xml.sax.SAXException: No input specified.
09-13 14:57:34.100: W/System.err(3823):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:285)
09-13 14:57:34.100: W/System.err(3823):     at com.project.example.app.XmlParserHandlerFinal.getQueryResponse(XmlParserHandlerFinal.java:170)
09-13 14:57:34.100: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.success(UpdateActivity.java:598)
09-13 14:57:34.105: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.onPostExecute(UpdateActivity.java:590)
09-13 14:57:34.105: W/System.err(3823):     at com.project.example.app.UpdateActivity$NetworkTask.onPostExecute(UpdateActivity.java:1)
09-13 14:57:34.105: W/System.err(3823):     at android.os.AsyncTask.finish(AsyncTask.java:417)
09-13 14:57:34.105: W/System.err(3823):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
09-13 14:57:34.105: W/System.err(3823):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
09-13 14:57:34.105: W/System.err(3823):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-13 14:57:34.105: W/System.err(3823):     at android.os.Looper.loop(Looper.java:130)
09-13 14:57:34.105: W/System.err(3823):     at android.app.ActivityThread.main(ActivityThread.java:3691)
09-13 14:57:34.105: W/System.err(3823):     at java.lang.reflect.Method.invokeNative(Native Method)
09-13 14:57:34.105: W/System.err(3823):     at java.lang.reflect.Method.invoke(Method.java:507)
09-13 14:57:34.105: W/System.err(3823):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
09-13 14:57:34.105: W/System.err(3823):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
09-13 14:57:34.105: W/System.err(3823):     at dalvik.system.NativeStart.main(Native Method)
09-13 14:57:34.174: I/dalvikvm(3823): Failed resolving Lcom/project/example/app/NotificationActivityForMultiProf; interface 26 'Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;'
09-13 14:57:34.174: W/dalvikvm(3823): Link of class 'Lcom/project/example/app/NotificationActivityForMultiProf;' failed
09-13 14:57:34.174: E/dalvikvm(3823): Could not find class 'com.project.example.app.NotificationActivityForMultiProf', referenced from method com.project.example.app.ConfigFinalActivity.showNotification
09-13 14:57:34.174: W/dalvikvm(3823): VFY: unable to resolve const-class 561 (Lcom/project/example/app/NotificationActivityForMultiProf;) in Lcom/project/example/app/ConfigFinalActivity;
09-13 14:57:34.174: D/dalvikvm(3823): VFY: replacing opcode 0x1c at 0x004b
09-13 14:57:34.174: D/dalvikvm(3823): VFY: dead code 0x004d-007f in Lcom/project/example/app/ConfigFinalActivity;.showNotification ()V
09-13 14:57:36.494: W/KeyCharacterMap(3823): No keyboard for id 0
09-13 14:57:36.494: W/KeyCharacterMap(3823): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
09-13 14:57:36.785: D/CLIPBOARD(3823): Hide Clipboard dialog at Starting input: finished by someone else... !

资源:

    // AsyncTask to call web service
    public class NetworkTask extends AsyncTask<String, Integer, InputStream> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //
        }

        @Override
        protected InputStream doInBackground(String... params) {
            int result = 0;

            {
                Log.i("url...", Base_URL);

                try {
                    stream = getQueryResults(Base_URL);
                } catch (SocketTimeoutException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (SSLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (SAXException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                // The code below plays a ST Promo animation
                // prior to displaying update success or failure message
                for (int incr = 0; incr < 2; incr++) {
                    // Sleep for 1/2 second
                    // Invoke UI to change updating text to show 1 dot
                    // And Increasing the level to reduce the amount of clipping
                    // and
                    // slowly reveals the hand image
                    publishProgress(R.drawable.loading_full,
                            R.drawable.loading_empty, R.drawable.loading_empty,
                            R.drawable.loading_empty, R.drawable.loading_empty);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block

                    }
                    publishProgress(R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_empty,
                            R.drawable.loading_empty, R.drawable.loading_empty);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block

                    }
                    publishProgress(R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_full,
                            R.drawable.loading_empty, R.drawable.loading_empty);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block

                    }
                    publishProgress(R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_empty);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block

                    }
                    publishProgress(R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_full,
                            R.drawable.loading_full, R.drawable.loading_full);

                    // Sleep for 1/2 second
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block

                    }
                }

                    return stream;
            }


        }
        /*
         * Sends a query to server and gets back the parsed results in a bundle
         * urlQueryString - URL for calling the webservice
         */
        protected synchronized InputStream getQueryResults(String urlQueryString)
                throws IOException, SAXException, SSLException,
                SocketTimeoutException, Exception {
            try {
                // HttpsURLConnection https = null;
                String uri = urlQueryString;

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                BasicNameValuePair mdn1, mdn2,id1,id2;
                if (MDN.equals("")) {
                    mdn1 = new BasicNameValuePair("mdn1", null);
                    mdn2 = new BasicNameValuePair("mdn2", null);
                } else {
                    mdn1 = new BasicNameValuePair("mdn1", mdN1.toString());
                    mdn2 = new BasicNameValuePair("mdn2", mdN2.toString());

                }

                BasicNameValuePair car = new BasicNameValuePair("car", caR);
                if (ICCID.equals("")) {
                     id1 = new BasicNameValuePair("id1", null);
                     id2 = new BasicNameValuePair("id2", null);
                } else {
                     id1 = new BasicNameValuePair("id1",
                            iD1.toString());
                     id2 = new BasicNameValuePair("id2",
                            iD2.toString());
                }

                nameValuePairs.add(mdn1);
                nameValuePairs.add(mdn2);
                nameValuePairs.add(car);
                nameValuePairs.add(id1);
                nameValuePairs.add(id2);

                UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(
                        nameValuePairs, "ISO-8859-1");
                KeyStore trustStore = KeyStore.getInstance(KeyStore
                        .getDefaultType());
                trustStore.load(null, null);

                SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

                HttpParams params = new BasicHttpParams();
                HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
                HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

                SchemeRegistry registry = new SchemeRegistry();
                registry.register(new Scheme("http", PlainSocketFactory
                        .getSocketFactory(), 80));
                registry.register(new Scheme("https", sf, 443));

                ClientConnectionManager ccm = new ThreadSafeClientConnManager(
                        params, registry);

                HttpClient httpClient = new DefaultHttpClient(ccm, params);
                params = httpClient.getParams();
                HttpClientParams.setRedirecting(params, true);

                HttpPost httpPost = new HttpPost(uri);
                httpPost.addHeader("Authorization",
                        getB64Auth("nmundru", "abc123"));

                httpPost.setHeader("Content-Type", "text/plain; charset=utf-8");

                Log.v("httpPost", httpPost.toString());

                httpPost.setEntity(urlEncodedFormEntity);
                HttpResponse httpResponse = httpClient.execute(httpPost);
                System.out.println("response...." + httpResponse.toString());
                Log.v("response...", httpResponse.toString());

                stream = httpResponse.getEntity().getContent();

                // save the InputStream in a file

                try {

                    FileOutputStream fOut = openFileOutput("settings.xml",
                            Context.MODE_WORLD_READABLE);

                    DataInputStream in = new DataInputStream(stream);
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(in));
                    String strLine;
                    while ((strLine = br.readLine()) != null) {
                         System.out.println(strLine); //to print the response
                        // in logcat
                        fOut.write(strLine.getBytes());

                    }
                    fOut.close();

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                fis = openFileInput("settings.xml");

            } catch (Exception e) {
                Log.e(LOG_TAG, e.toString());
                tryagain();

            } finally {
                // https.disconnect();
            }

            return stream;
        }

        private String getB64Auth(String login, String pass) {
            String source = login + ":" + pass;
            String ret = "Basic "
                    + Base64.encodeToString(source.getBytes(), Base64.URL_SAFE
                            | Base64.NO_WRAP);
            return ret;
        }
        @Override
        protected void onPostExecute(InputStream stream) {
            super.onPostExecute(stream);
            // This method is called to parse the response and save the
            // ArrayLists
            success();

        }

        public void success() {

            // to parse the response
            try {
                handler.getQueryResponse(fis);
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // set method to save the ArryaLists from the parser
            setArrayList();
            Intent i = new Intent(UpdateActivity.this, ConfigFinalActivity.class);
            startActivity(i);
            finish();

        }
        // Framework UI thread method corresponding to publishProgress call in
        // worker thread
        protected void onProgressUpdate(Integer... progress) {
            // Call function to update image view
            setProgressImgView(progress[0], progress[1], progress[2],
                    progress[3], progress[4]);
        }

    }

    private void setProgressImgView(Integer imgViewId1, Integer imgViewId2,
            Integer imgViewId3, Integer imgViewId4, Integer imgViewId5) {
        // update image view with the updating dots
        // Reset view layout in case orientation while updating
        setContentView(R.layout.updating);
        mProgressImageview1 = (ImageView) findViewById(R.id.loading_empty1);
        mProgressImageview2 = (ImageView) findViewById(R.id.loading_empty2);
        mProgressImageview3 = (ImageView) findViewById(R.id.loading_empty3);
        mProgressImageview4 = (ImageView) findViewById(R.id.loading_empty4);
        mProgressImageview5 = (ImageView) findViewById(R.id.loading_empty5);
        mProgressImageview1.setImageResource(imgViewId1);
        mProgressImageview2.setImageResource(imgViewId2);
        mProgressImageview3.setImageResource(imgViewId3);
        mProgressImageview4.setImageResource(imgViewId4);
        mProgressImageview5.setImageResource(imgViewId5);


    }

    @Override
    protected void onRestart() {
        super.onRestart();

        if (mErrorAlert != null)
            mErrorAlert.dismiss();
    }

    public void tryagain() {
        // Displaying final layout after failure of pre-ICS automatic settings
        // update
        setContentView(R.layout.tryagain);
        String tryAgainText = "";
        CharSequence styledTryAgainText;

        tryAgainText = String.format(getString(R.string.tryagain_text1),
                TotalSteps);
        styledTryAgainText = Html.fromHtml(tryAgainText);
        TextView tryAgain1 = (TextView) findViewById(R.id.tryagain_text1);
        tryAgain1.setText(styledTryAgainText);

        tryAgainText = String.format(getString(R.string.tryagain_text2),
                TotalSteps);
        styledTryAgainText = Html.fromHtml(tryAgainText);
        TextView tryAgain2 = (TextView) findViewById(R.id.tryagain_text2);
        tryAgain2.setText(styledTryAgainText);

        tryAgainText = String.format(getString(R.string.tryagain_text3),
                TotalSteps);
        styledTryAgainText = Html.fromHtml(tryAgainText);
        TextView tryAgain3 = (TextView) findViewById(R.id.tryagain_text3);
        tryAgain3.setText(styledTryAgainText);

    }
    private void assistUpdate() {
        // Displaying final layout after pre-ICS automatic settings update
        setContentView(R.layout.assist_update);
        assist_update_btn = (Button) findViewById(R.id.assist_update_btn);
        assist_update_btn.setOnClickListener((OnClickListener) this);

    }

    public void success() {

        // to parse the response
        try {
            handler.getQueryResponse(fis);
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // set method to save the ArryaLists from the parser
        setArrayList();
        Intent i = new Intent(this, ConfigFinalActivity.class);
        startActivity(i);
        finish();

    }

    public String getResult() {

        return result;
    }

}

解决方法:

       protected InputStream doInBackground(String... params)

你有

      stream = getQueryResults(Base_URL);

然后在getQueryResults中你有

    catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            tryagain();

        }

在你的尝试中

    public void tryagain() {
    setContentView(R.layout.tryagain);

您无法从后台线程更新/访问ui.这就是你得到那个例外的原因.

你还应该考虑你的设计.如果您在同一个活动中多次使用setContentView,请重新考虑您的设计.

而不是多个try块有一个try块和多个catch块.

不确定你想要什么,但你不止一次调用publishProgress.

上一篇:如何在Eclipse中过滤到Logcat的消息?


下一篇:从Logcat或Android访问旧/过去的日志