Exception块中的Toast不会显示

时间:2012-08-11 20:47:14

标签: android toast forceclose

在我的代码中,当服务器没有响应时,错误消息显示在日志中,但catch块中的Toast消息未显示。我也试过getApplicationContext(),但没有帮助。当服务器没有响应时,我收到一个强制关闭消息“应用程序已意外停止。请稍后再试。”

package de.vogella.android.asyntask;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class ReadWebpageAsynTask extends Activity {
    private static final String LOG_TAG = null;

private TextView textView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.TextView01);
}

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
 protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
 DefaultHttpClient client = new DefaultHttpClient();
 HttpGet httpGet = new HttpGet(url);
 try {
 HttpResponse execute = client.execute(httpGet);
 InputStream content = execute.getEntity().getContent();

 BufferedReader buffer = new BufferedReader(
   new InputStreamReader(content));
 String s = "";
 while ((s = buffer.readLine()) != null) {
  response += s;
 }

} catch (Exception e) {
         Toast.makeText(ReadWebpageAsynTask.this, "error  server not responding
"     + e.getMessage().toString(),  Toast.LENGTH_LONG).show();


       Log.e(LOG_TAG, "Connection Error ", e);

 e.printStackTrace();
}
}
return response;
}

@Override
protected void onPostExecute(String result) {
textView.setText(result);

 }
}

public void readWebpage(View view) {
 DownloadWebPageTask task = new DownloadWebPageTask();
 task.execute(new String[] { "http://www.vogella.de" });

}
}

这是logcat输出

 08-12 03:11:28.856: W/dalvikvm(824): threadid=7: thread exiting with uncaught        
  exception (group=0x4001d800)
 08-12 03:11:28.876: E/AndroidRuntime(824): FATAL EXCEPTION: AsyncTask #1
 08-12 03:11:28.876: E/AndroidRuntime(824): java.lang.RuntimeException: An error
  occured while executing doInBackground()
08-12 03:11:28.876: E/AndroidRuntime(824):  at     
android.os.AsyncTask$3.done(AsyncTask.java:200)

08-12 03:11:28.876: E/AndroidRuntime(824):  at     
 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)


   08-12 03:11:28.876: E/AndroidRuntime(824):   at     
 java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-12 03:11:28.876: E/AndroidRuntime(824):  at     
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at     
java.util.concurrent.FutureTask.run(FutureTask.java:137)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at     
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-12 03:11:28.876: E/AndroidRuntime(824):  at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at    
 java.lang.Thread.run(Thread.java:1096)

 08-12 03:11:28.876: E/AndroidRuntime(824): Caused by: java.lang.RuntimeException:    
 Can't create handler inside thread that has not called Looper.prepare()
 08-12 03:11:28.876: E/AndroidRuntime(824):     at android.os.Handler.<init>    
 (Handler.java:121)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at android.widget.Toast.<init>  
(Toast.java:68)
  08-12 03:11:28.876: E/AndroidRuntime(824):    at     
android.widget.Toast.makeText(Toast.java:231)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at    

  08-12 03:11:28.876: E/AndroidRuntime(824):    at    
 android.os.AsyncTask$2.call(AsyncTask.java:185)
 08-12 03:11:28.876: E/AndroidRuntime(824):     at    
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-12 03:11:28.876: E/AndroidRuntime(824):  ... 4 more

1 个答案:

答案 0 :(得分:7)

我最好的猜测是Asynctask线程在吐司显示时完成。 所以使用

runOnUiThread(new Runnable(){
   @Override
   public void run() {
         Toast.makeText(ReadWebpageAsynTask.this,
         "error - server not responding" + e.getMessage().toString(),
         Toast.LENGTH_LONG).show();
   }
});