5

我有一个活动(RecipiesActivity),通过单击我的应用程序的主要活动的“下一步”按钮打开。

在 RecipiesActivity onCreate 中,我想在 AsyncTask 中调用 Web 服务。目前,由于我还没有实现 web 服务,我只是调用了 bitly 提供的 web 服务(但这与我的问题无关)。

问题是虽然调用了webservice并且没有抛出异常,但是从doInBackground返回了一个结果,但是我的onPostExecute没有被调用。我进行了一些研究,发现了如下可能的原因 - 但似乎没有一个是我的情况:

  • onPostExecute 参数与 AsyncTask 参数不匹配 - 在我的情况下它们匹配
  • android 中的一个错误,它不允许在 UI 线程中执行 AsyncTask。使用 Class.forName("android.os.AsyncTask") 可以克服它 - 我试过这个并没有任何区别
  • AsyncTask 不是从 UI 线程启动的——就我而言,我相信它是
  • doInBackground 没有返回 - 在我的情况下它确实返回了,我已经使用调试器逐步完成了它
  • 在 onPostExecute 之前不使用 @Override - 在我的情况下,我使用的是 @Override

代码如下:

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);
            }
        }       
    }
}

感谢您的帮助,

谢谢

4

3 回答 3

5

而不是doInBackground(),只需调用execute()AsyncTask 的方法。调用doInBackground()执行它在锡上所说的:调用doInBackground()(在同一个线程中)并返回。它不会召唤onPostExecute()你。execute()将启动一个后台线程,doInBackground()在后台线程上调用,然后在 UI 线程上发布doInBackground()to的结果。onPostExecute()

于 2012-08-27T08:34:53.203 回答
3

尝试更改此行

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");
于 2012-08-27T08:42:35.253 回答
1

确保你的 onPostExecute 函数有 @Override

于 2013-09-09T14:54:34.457 回答