5

アプリケーションのメイン アクティビティの [次へ] ボタンをクリックして開くアクティビティ (RecipiesActivity) があります。

RecipiesActivity onCreate では、AsyncTask で Web サービスを呼び出したいと考えています。今のところ、まだ Web サービスを実装していないので、bitly が提供する Web サービスを呼び出すだけです (ただし、これは私の問題とは関係ありません)。

問題は、Web サービスが呼び出されて例外がスローされなくても、doInBackground から結果が返されるが、onPostExecute が呼び出されないことです。私はいくつかの調査を行い、以下にリストされている考えられる理由を見つけましたが、私の場合はそうではないようです:

  • onPostExecute パラメーターは AsyncTask パラメーターと一致しません - 私の場合は一致します
  • UI スレッドで AsyncTask を実行できない Android のバグ。Class.forName("android.os.AsyncTask") を使用することでおそらく克服されます-これを試してみましたが、違いはありませんでした
  • AsyncTask は UI スレッドから開始されていません。私の場合、そうであると思います。
  • doInBackground は返されません-私の場合は返されます。デバッガでステップスルーしました
  • @Override は onPostExecute の前に使用されません - 私の場合は @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

の代わりに、AsyncTaskdoInBackground()のメソッドを呼び出すだけです。execute()呼び出しdoInBackground()は、ブリキに書かれていることdoInBackground()を行います。つまり、(同じスレッドで)呼び出して戻ります。それはあなたを呼びませonPostExecute()ん。execute()バックグラウンド スレッドを開始し、バックグラウンド スレッドで呼び出してから、 toの結果をUI スレッドにdoInBackground()投稿します。doInBackground()onPostExecute()

于 2012-08-27T08:34:53.203 に答える
3

Try changing this line

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

to

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 に答える