当我运行asynctask连接到HTTP服务器时,我想在无法连接到服务器时显示错误消息。相反,应用程序强制关闭错误,而不显示错误消息。我想在发生错误而不是崩溃时显示错误消息,但它只是在正文描述警告对话框中显示带有消息错误的警告对话框(e.getMessage())。
以下是我的代码:
private String downloadUrl(String strUrl) throws IOException {
String data = "";
InputStream iStream = null;
try {
URL url = new URL(strUrl);
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.connect();
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (IOException e) {
Log.d(TAG, e.getMessage());
ErrorDialog(e.getMessage());
}
return data;
}
private class DownloadTask extends AsyncTask<String, Integer, String> {
String data = null;
@Override
protected String doInBackground(String... url) {
try {
data = downloadUrl(url[0]);
} catch (IOException e) {
Log.d(TAG, e.getMessage());
ErrorDialog(e.getMessage());
}
return data;
}
@Override
protected void onPostExecute(String result) {
if (result != null && result.length() < 0) {
ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
listViewLoaderTask.execute(result);
}
}
}
private void ErrorDialog(String Description) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
ListCategoryActivity.this);
alertDialog.setTitle("You get Error...");
alertDialog.setMessage(Description);
alertDialog.setIcon(R.drawable.ic_warning);
alertDialog.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
Logcat错误:
01-23 11:58:36.949: E/AndroidRuntime(5776): FATAL EXCEPTION: AsyncTask #1
01-23 11:58:36.949: E/AndroidRuntime(5776): java.lang.RuntimeException: An error occured while executing doInBackground()
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.os.AsyncTask$3.done(AsyncTask.java:278)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.lang.Thread.run(Thread.java:856)
01-23 11:58:36.949: E/AndroidRuntime(5776): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.os.Handler.<init>(Handler.java:121)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.app.Dialog.<init>(Dialog.java:107)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.app.AlertDialog.<init>(AlertDialog.java:114)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.app.AlertDialog$Builder.create(AlertDialog.java:913)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.app.AlertDialog$Builder.show(AlertDialog.java:931)
01-23 11:58:36.949: E/AndroidRuntime(5776): at com.haichal.codefive.ListCategoryActivity.ErrorDialog(ListCategoryActivity.java:327)
01-23 11:58:36.949: E/AndroidRuntime(5776): at com.haichal.codefive.ListCategoryActivity.downloadUrl(ListCategoryActivity.java:150)
01-23 11:58:36.949: E/AndroidRuntime(5776): at com.haichal.codefive.ListCategoryActivity.access$2(ListCategoryActivity.java:125)
01-23 11:58:36.949: E/AndroidRuntime(5776): at com.haichal.codefive.ListCategoryActivity$DownloadTask.doInBackground(ListCategoryActivity.java:162)
01-23 11:58:36.949: E/AndroidRuntime(5776): at com.haichal.codefive.ListCategoryActivity$DownloadTask.doInBackground(ListCategoryActivity.java:1)
01-23 11:58:36.949: E/AndroidRuntime(5776): at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-23 11:58:36.949: E/AndroidRuntime(5776): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-23 11:58:36.949: E/AndroidRuntime(5776): ... 5 more
01-23 11:58:38.079: E/WindowManager(5776): Activity com.haichal.codefive.ListCategoryActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41410d58 that was originally added here
01-23 11:58:38.079: E/WindowManager(5776): android.view.WindowLeaked: Activity com.haichal.codefive.ListCategoryActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41410d58 that was originally added here
01-23 11:58:38.079: E/WindowManager(5776): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
01-23 11:58:38.079: E/WindowManager(5776): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
01-23 11:58:38.079: E/WindowManager(5776): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
01-23 11:58:38.079: E/WindowManager(5776): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
01-23 11:58:38.079: E/WindowManager(5776): at android.view.Window$LocalWindowManager.addView(Window.java:537)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.Dialog.show(Dialog.java:278)
01-23 11:58:38.079: E/WindowManager(5776): at com.haichal.codefive.ListCategoryActivity.startDownload(ListCategoryActivity.java:100)
01-23 11:58:38.079: E/WindowManager(5776): at com.haichal.codefive.ListCategoryActivity.initFromDb(ListCategoryActivity.java:91)
01-23 11:58:38.079: E/WindowManager(5776): at com.haichal.codefive.ListCategoryActivity.onCreate(ListCategoryActivity.java:54)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.Activity.performCreate(Activity.java:4465)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1923)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1984)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.ActivityThread.access$600(ActivityThread.java:126)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1150)
01-23 11:58:38.079: E/WindowManager(5776): at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 11:58:38.079: E/WindowManager(5776): at android.os.Looper.loop(Looper.java:137)
01-23 11:58:38.079: E/WindowManager(5776): at android.app.ActivityThread.main(ActivityThread.java:4456)
01-23 11:58:38.079: E/WindowManager(5776): at java.lang.reflect.Method.invokeNative(Native Method)
01-23 11:58:38.079: E/WindowManager(5776): at java.lang.reflect.Method.invoke(Method.java:511)
01-23 11:58:38.079: E/WindowManager(5776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
01-23 11:58:38.079: E/WindowManager(5776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
01-23 11:58:38.079: E/WindowManager(5776): at dalvik.system.NativeStart.main(Native Method)
Logcat verbose e.getMessage();
01-23 11:58:36.909: D/HaichalLog(5776): failed to connect to
/192.168.103.121 (port 80): connect failed: ENETUNREACH (Network is unreachable)
感谢。
答案 0 :(得分:3)
在日志中:
RuntimeException:无法在没有的线程内创建处理程序 叫做Looper.prepare()
因为你试图从AsyncTask的doInBackground显示AlertDialog而我们无法从doInBackground方法更新UI元素。更改代码以处理doInBackground中的执行:
String strcatcherror="";
@Override
protected String doInBackground(String... url) {
try {
data = downloadUrl(url[0]);
strcatcherror="";
} catch (IOException e) {
Log.d(TAG, e.getMessage());
strcatcherror=e.getMessage();
}
return data;
}
@Override
protected void onPostExecute(String result) {
if(!strcatcherror.equals("")){
if (result != null && result.length() < 0) {
ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
listViewLoaderTask.execute(result);
}
}
else{
// show error message here
ErrorDialog(strcatcherror);
}
}
答案 1 :(得分:2)
ErrorDialog(e.getMessage());
你不能在doInBackground()中调用警告对话框。
因此Alternativce方法将全局变量(如XYZ)置于Asyc类中,并将e.getMessage()设置为catch块内的Variable XYZ。并检查该变量是否为空并执行ErrorDialog(XYZ);在onPostExecute()方法中。
希望它会对你有所帮助。
答案 2 :(得分:2)
将您的对话框与UI线程分开运行。试试这样:
private class DownloadTask extends AsyncTask<String, Integer, String> { String data = null; @Override protected String doInBackground(String... url) { try { data = downloadUrl(url[0]); } catch (IOException e) { Log.d(TAG, e.getMessage()); runOnUiThread(new Runnable(){ public void run() { ErrorDialog(e.getMessage()); } }); } } return data; } @Override protected void onPostExecute(String result) { if (result != null && result.length() < 0) { ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask(); listViewLoaderTask.execute(result); } } }
答案 3 :(得分:2)
您无法直接从doinbackground()显示警告对话框。您需要从runOnUIThread()调用它或从postExecute()调用它或向活动处理程序发送消息。
答案 4 :(得分:0)
Urlconnection有setTimeout方法。 使用SocketTimeOutException(它将被抛回调用者)捕获它。 用吐司处理它。