2012-08-27 64 views
5

Tôi có Hoạt động (RecipiesActivity) được mở bằng cách nhấp vào nút "Tiếp theo" của Activitiy chính của ứng dụng của tôi.onPostExecute không được gọi là

Trong RecipiesActivity onCreate, tôi muốn gọi một dịch vụ web trong AsyncTask. Hiện tại, vì tôi chưa triển khai dịch vụ web, tôi chỉ gọi một dịch vụ web được cung cấp một chút (nhưng điều này không liên quan đến vấn đề của tôi).

Vấn đề là mặc dù webservice được gọi và không có ngoại lệ được ném, kết quả là trả về từ doInBackground, nhưng onPostExecute của tôi không được gọi. Tôi đã làm một số nghiên cứu và tôi đã tìm thấy lý do có thể được liệt kê dưới đây - nhưng không ai có vẻ là trường hợp của tôi:

  • thông số onPostExecute không phù hợp với các thông số AsyncTask - trong trường hợp của tôi họ phù hợp
  • Một lỗi trong android không cho phép AsyncTask được thực hiện trong chuỗi giao diện người dùng. Đó là những kết quả đáng tiếc bằng cách sử dụng Class.forName ("android.os.AsyncTask") - Tôi đã thử điều này và không tạo ra bất kỳ sự khác biệt nào
  • AsyncTask không được bắt đầu từ chuỗi giao diện người dùng - trong trường hợp của tôi tôi tin là
  • doInBackground không trả lại - trong trường hợp của tôi có, tôi đã bước qua nó với debugger
  • @ Override không được sử dụng trước khi onPostExecute - trong trường hợp của tôi, tôi đang sử dụng @ Override

mã này là dưới đây:

public class RecipiesActivity extends Activity { 

    private TextView tv; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_recipies); 
     tv = (TextView) findViewById(R.id.Response); 

     //Start the WS call in an AsyncTask 
     new CallWS().doInBackground("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F");   
    } 

    private class CallWS extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... params) { 

      String result = null; 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpGet get_request = new HttpGet(params[0]); 
      try 
      { 
       HttpResponse httpResponse = httpClient.execute(get_request, localContext); 
       //int responseCode = httpResponse.getStatusLine().getStatusCode(); 
       HttpEntity entity = httpResponse.getEntity(); 
       if (entity != null) 
       { 
        InputStream istream = entity.getContent(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(istream)); 

        try 
        { 
         result = br.readLine(); 
        } 
        catch (Exception e) 
        { 
         //TODO Handle the IOException that the readline may throw 
        } 
        finally 
        { 
         istream.close(); 
        } 
       } 

      }catch (Exception e) 
      { 
       //TODO Handle the IOException and the ClientProtocolException that the 
       // httpClient.execute can throw 
      } 
      finally 
      { 
       httpClient.getConnectionManager().shutdown(); 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      if (result == null) 
      { 
       tv.setText("The result is NULL"); 
      } 
      else 
      { 
       tv.setText(result); 
      } 
     }  
    } 
} 

sự giúp đỡ của bạn là appreceiated,

nhờ

Trả lời

5

Thay vì doInBackground(), chỉ cần gọi phương thức execute() của AsyncTask. Gọi số doInBackground() thực hiện những gì trên tin nhắn: gọi số doInBackground() (trong cùng một chuỗi) và trả về. Nó sẽ không gọi onPostExecute() cho bạn. execute() sẽ bắt đầu chuỗi nền, gọi doInBackground() trên chuỗi nền, sau đó đăng kết quả của doInBackground() tới onPostExecute() trên chuỗi giao diện người dùng.

+0

Thank you very much. Lỗi này (rõ ràng) đã gây ra vấn đề. – Lefteris

+0

đánh dấu giải pháp là được chấp nhận ... – Hades

+0

Tôi sẽ làm như vậy ngay sau khi nó được đăng, nhưng nó đòi hỏi tôi phải chờ khoảng 7-10 phút trước khi làm như vậy. Dù sao, câu trả lời được đánh dấu bây giờ :) – Lefteris

3

Hãy thử thay đổi dòng này

new CallWS().doInBackground("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F"); 

để

new CallWS().execute("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F"); 
+0

Cảm ơn bạn, đây là lỗi rõ ràng và ngớ ngẩn thực hiện. Tôi cũng đánh dấu đây là một câu trả lời, nhưng không may, tôi chỉ có thể đánh dấu một câu trả lời. – Lefteris

+1

Đừng bận tâm, vui vì nó hoạt động, tuy nhiên bạn có thể upvote bình luận nếu nó hữu ích cho bạn. – mtekeli

1

Hãy chắc chắn rằng chức năng onPostExecute của bạn có @ Override

Các vấn đề liên quan