我在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.
谁看过这个吗?我不确定到底是什么引起了问题。
完整日志:
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();
}
您在
tryagain
中 public void tryagain() {
setContentView(R.layout.tryagain);
您无法从后台线程更新/访问ui。这就是为什么您遇到该异常的原因。
您还应该重新考虑您的设计。如果您在同一活动中多次使用
setContentView
,请重新考虑您的设计。另外,不是多个尝试块,而是具有一个try块和多个catch块。
不确定您要什么,但是您多次呼叫
publishProgress
。关于java - android.view.ViewRoot $ CalledFromWrongThreadException:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18789585/