主類調用異步任務。異步任務調用2個過程。第一個解析XML文件並獲得html鏈接。第二個閱讀該HTML文件。粘貼異步任務代碼和通過html文件讀取的第二個過程(不要認爲第一個過程會導致問題)即使處理每個http異常並設置套接字超時後,我也會收到「強制關閉」異常。如果我單獨調用readfile過程,我的移動設備上會發生套接字超時異常(如果連接速度很慢)。但是如果我從異步任務中調用它,我會得到強制關閉異常。Android:http套接字超時 - 強制關閉錯誤
1)爲什麼我在logcat中發生sockettimeout異常,即使我已經處理異常? 2)我將異常錯誤消息傳回給asynctask。但仍然沒有得到顯示。我應該在異步任務程序中應用try-catch嗎?
請幫忙。
問候, 山姆
private class SelectDataTask extends AsyncTask<String, Void, List<String> {
private final ProgressDialog dialog = new ProgressDialog(MessageList.this);
// can use UI thread here
@Override
protected void onPreExecute() {
dialog.setMessage("Fetching scores...");
dialog.show();
}
// automatically done on worker thread (separate from UI thread)
@Override
protected List<String> doInBackground(final String... args) {
List<String> scores = new ArrayList<String>();
List<String> scores1 = new ArrayList<String>();
scores = loadFeed() ;
//return loadFeed();
for (String sco : scores) {
scores1.add(readFile(sco));
}
return scores1;
}
// can use UI thread here
@Override
protected void onPostExecute(final List<String> result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
adapter =
new ArrayAdapter<String>(MessageList.this,R.layout.row,result);
MessageList.this.setListAdapter(adapter);
}
}
private String readFile(String htmllink){
String TAG = "myActivity";
List<String> scores = new ArrayList<String>();
String result="";
String score = "";
int CONNECTION_TIMEOUT_MS = 30 * 1000; // ms
HttpParams my_httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(my_httpParams,CONNECTION_TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(my_httpParams, CONNECTION_TIMEOUT_MS);
HttpClient client = new DefaultHttpClient(my_httpParams); // get http client with given params
HttpGet request = new HttpGet(htmllink);
try{
HttpResponse response = client.execute(request);
//txtResult.setText(HttpHelper.request(response));
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try{
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line + "\n");
}
in.close();
result = str.toString();
//result = str.toString().substring(1,500);
Pattern p = Pattern.compile(
"<title>(.*)</title>",
Pattern.DOTALL
);
Matcher matcher = p.matcher(
result
);
if (matcher.find())
{
score = matcher.group(1).toString();
}
return score;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this, "IOException e = " + e.toString(), Toast.LENGTH_LONG).show();
Log.d(TAG, "IOException e = " + e.toString());
client.getConnectionManager().shutdown();
return "IOException e = " + e.toString();
}catch(Exception ex){
result = "Error";
ex.printStackTrace();
Toast.makeText(this, "Exception ex = " + ex.toString(), Toast.LENGTH_LONG).show();
Log.d(TAG,"Exception ex = " + ex.toString());
client.getConnectionManager().shutdown();
return "Exception ex = " + ex.toString();
}
} else {
client.getConnectionManager().shutdown();
return "Error connecting" + response.getStatusLine().toString();
//sin.close();
} //httpstatus
} catch (SocketTimeoutException e) {
e.printStackTrace();
Toast.makeText(this, "SocketTimeoutException e = " + e.toString(), Toast.LENGTH_LONG).show();
Log.d(TAG, "SocketTimeoutException e = " + e.toString());
client.getConnectionManager().shutdown();
return "SocketTimeoutException e = " + e.toString();
}catch(Exception ex){
Toast.makeText(this, "Exception ex1 = " + ex.toString(), Toast.LENGTH_LONG).show();
Log.d(TAG, "Exception ex1 = " + ex.toString());
client.getConnectionManager().shutdown();
return "Exception ex1 = " + ex.toString();
}
logcat的錯誤信息
W/System.err(18422): java.net.SocketTimeoutException
W/System.err(18422): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564)
W/System.err(18422): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:88)
W/System.err(18422): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
W/System.err(18422): at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
W/System.err(18422): at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:161)
W/System.err(18422): at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
W/System.err(18422): at java.io.InputStreamReader.read(InputStreamReader.java:275)
W/System.err(18422): at java.io.BufferedReader.fillBuf(BufferedReader.java:155)
W/System.err(18422): at java.io.BufferedReader.readLine(BufferedReader.java:425)
W/System.err(18422): at com.warriorpoint.androidxmlsimple.MessageList.readFile(MessageList.java:214)
W/System.err(18422): at com.warriorpoint.androidxmlsimple.MessageList.access$1(MessageList.java:182)
W/System.err(18422): at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:158)
W/System.err(18422): at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:1)
W/System.err(18422): at android.os.AsyncTask$2.call(AsyncTask.java:185)
W/System.err(18422): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
W/System.err(18422): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
W/System.err(18422): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
W/System.err(18422): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
W/System.err(18422): at java.lang.Thread.run(Thread.java:1096)
W/dalvikvm(18422): threadid=7: thread exiting with uncaught exception (group=0x400207d8)
E/AndroidRuntime(18422): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime(18422): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(18422): at android.os.AsyncTask$3.done(AsyncTask.java:200)
E/AndroidRuntime(18422): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(18422): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(18422): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(18422): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(18422): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
E/AndroidRuntime(18422): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
E/AndroidRuntime(18422): at java.lang.Thread.run(Thread.java:1096)
E/AndroidRuntime(18422): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime(18422): at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime(18422): at android.widget.Toast.<init>(Toast.java:68)
E/AndroidRuntime(18422): at android.widget.Toast.makeText(Toast.java:231)
E/AndroidRuntime(18422): at com.warriorpoint.androidxmlsimple.MessageList.readFile(MessageList.java:276)
E/AndroidRuntime(18422): at com.warriorpoint.androidxmlsimple.MessageList.access$1(MessageList.java:182)
E/AndroidRuntime(18422): at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:158)
E/AndroidRuntime(18422): at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:1)
E/AndroidRuntime(18422): at android.os.AsyncTask$2.call(AsyncTask.java:185)
E/AndroidRuntime(18422): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(18422): ... 4 more
W/ActivityManager( 158): Force finishing activity com.warriorpoint.androidxmlsimple/.MessageList
這個問題是因爲我打印到日誌?我現在如何解決這個問題? – sammydude 2011-03-08 08:54:12
不,這個問題與SocketTimeoutException無關。我的意思是SocketTimeoutException stacktrace首先在日誌中顯示,因爲你在那裏打印它,但是你的應用程序被殺死的原因是異常打印機_在日誌之後。 – Zds 2011-03-08 10:27:11