2012-11-10 41 views
0

我有我的活动上面的类,并从一个活动的OnCreate方法运行它。我应该如何处理AsyncTask种类中的异常?

class UpdateTask extends AsyncTask<String, Void, Void>{ 
     @Override 
     protected Void doInBackground(String... params) { 
      Log.d(this.toString(), "-> doInBackground"); 
      HttpResponse response; 
      try { 
       HttpParams params1 = new BasicHttpParams(); 
       HttpConnectionParams.setConnectionTimeout(params1, 3000); 
       HttpConnectionParams.setSoTimeout(params1, 5000); 
       HttpClient httpclient = new DefaultHttpClient(params1); 
       Log.d(this.toString(), "HTTP GET to " + "http://www.google.com"); 
       response = httpclient.execute(new HttpGet("http://www.google.com")); 

       //RequestTask t = new RequestTask(); 
       //response = t.doIt("http://www.google.com"); 
       StatusLine statusLine = response.getStatusLine(); 

       if(statusLine.getStatusCode() == HttpStatus.SC_OK){ 
        ByteArrayOutputStream out = new ByteArrayOutputStream();      
        response.getEntity().writeTo(out); 
        out.close(); 
        String responseString = out.toString(); 
        EventItem ei = new EventItem(responseString, responseString, null); 
        addEventItemToContent(ei, ContentStatus.ACTIVE); 
        Log.d(this.toString(), "doInBackground -success->"); 
       } else { 
        Log.d(this.toString(), "doInBackground -something wrong->"); 
       } 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Интернет недоступен", Toast.LENGTH_LONG).show(); 

      } 

logcat的说:

11-11 01:31:19.100: D/[email protected](9956): -> doInBackground 
11-11 01:31:19.100: D/[email protected](9956): HTTP GET to http://www.google.com 
11-11 01:31:59.560: W/dalvikvm(9956): threadid=11: thread exiting with uncaught exception (group=0x409961f8) 
11-11 01:31:59.580: E/AndroidRuntime(9956): FATAL EXCEPTION: AsyncTask #1 
11-11 01:31:59.580: E/AndroidRuntime(9956): java.lang.RuntimeException: An error occured while executing doInBackground() 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.lang.Thread.run(Thread.java:856) 
11-11 01:31:59.580: E/AndroidRuntime(9956): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.os.Handler.<init>(Handler.java:121) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.widget.Toast$TN.<init>(Toast.java:317) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.widget.Toast.<init>(Toast.java:91) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.widget.Toast.makeText(Toast.java:233) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at com.rkovalev.first.app.MainActivity$UpdateTask.doInBackground(MainActivity.java:207) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at com.rkovalev.first.app.MainActivity$UpdateTask.doInBackground(MainActivity.java:1) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-11 01:31:59.580: E/AndroidRuntime(9956):  ... 5 more 

有一个在我的代码中的错误,或者我应该把手从另一个地方例外?


UPD:问题在上面的代码:

class UpdateTask extends AsyncTask<String, Integer, Void>{ 
    @Override 
    protected Void doInBackground(String... params) { 
    this.onProgressUpdate(0);   
    return null; 
    } 

    @Override 
     protected void onProgressUpdate(Integer... codes) { 
    Toast.makeText(getApplicationContext(), 
       "onPr.Upd.: why I haven't access to main ui thread???", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected void onPostExecute(Void res) { 
    Toast.makeText(getApplicationContext(), 
       "onPost.Ex.: I have access to main thread!", Toast.LENGTH_LONG).show(); 
    } 
} 

回答

2

问题的根源是,你正试图从UI线程之外显示敬酒,在这里:

catch (Exception e) { 
    Toast.makeText(getApplicationContext(), "Интернет недоступен", Toast.LENGTH_LONG).show(); 
} 

你不能与来自不同线程的UI元素进行交互。

您应该捕获异常(正常处理),然后致电onPostExecute()通知活动存在错误,以便活动可以显示此Toast。

+0

>通知活动存在错误,以便活动可以显示此Toast。在另一个问题howto如何做到这一点呢?:) – psct

0

而不是直接尝试在doInBackground中执行所有UI通知的东西,这本身不是UI线程。

您应该使用有权访问UI线程的方法,例如onProgressUpdate,onPostExecute。 你的情况就像这样。

catch (Exception e) { 
    publishProgress(error_code); // The error code for identifying 
} 

而在你onProgressUpdate方法

@Override 
     protected void onProgressUpdate(Integer... error_codes) { 
      if(error_codes[0] == my_desired_error_code){ 
    Toast.makeText(getApplicationContext(), "Интернет недоступен", Toast.LENGTH_LONG).show(); 
       } 
     } 

基本上你的流程应该是这样的通知的UI。

+0

对不起,我更新了answe,你能看看我的代码吗?我做错了什么? – psct

+0

对不起,但我有你的答案麻烦 – psct

相关问题