2012-08-11 61 views
0

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

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 
+3

发布异常堆栈 – nandeesh 2012-08-11 20:50:17

+0

西隧做ü意味着通过邮寄异常堆栈?如何打印吐司? – 2012-08-11 21:05:15

+0

我的意思是你得到的异常的logcat输出。 – nandeesh 2012-08-11 21:06:03

回答

7

我最好的猜测是的AsyncTask线程被正在显示敬酒的时间完成。 所以使用

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

我在哪里使用?内部抓块? – 2012-08-11 21:29:43

+0

+1好答案。 – 2012-08-12 01:37:22

+0

用上面的代码片段替换你的吐司消息 – nandeesh 2012-08-12 06:28:23