2

私はアンドロイドアプリを開発しています。今、私は AsyncTask を使用したいと思います。Android 4.1 では完全に動作しますが、doInBackground メソッドは Android 2.3.3 では動作しません。logcat にエラーはありません。

vom AsyncTask を拡張するクラスがあります。だから私は new Class().execute() で始めます。コンストラクターは常に機能します。

Android 2.3.3の問題をどのように解決できるか考えていますか?

編集: 私のコード:

private class TopicList extends AsyncTask<String, Integer, String> {
    private TopicList(){
        Log.e("Constructor","Works");
    }
    @Override
    protected String doInBackground(String... arg0) {
        Log.e("InBackground","Works");
        new Thread(new Runnable() {
            public void run() {
       // Network processes
                }
        }).start();
        return null;
    }
}

ターゲット バージョン 17 と minSdkVersion 7 があります。さらに詳しい情報が必要ですか? 次のコードを使用して実行します。

new TopicList().execute();

logcat のエラー ログは、コンストラクターが機能していることのみを示しています。

4

1 に答える 1

5

AsyncTask API: http://developer.android.com/reference/android/os/AsyncTask.html

上記のドキュメントを読んだ後、AsyncTask がバージョン 2.3.3 で正常に動作することは明らかです (API 3 = Android 1.5 で追加されました)。

正しいパラメーターが渡されていますか? WebService を呼び出して結果をアクティビティの TextView に表示する非同期タスクの簡単な例を次に示します。これが正しい軌道に乗るのに役立つことを願っています。

private class AsyncTaskWebServiceCaller extends AsyncTask<Void, Void, String> {
    private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

    @Override
    protected void onPreExecute() {
        dialog.setMessage("Connecting to Web Service...");
        dialog.show();
    }

    @Override
    protected String doInBackground(Void...voids) {
        //create the envelope for the message
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = false;

        //get the card (SOAPObject) that will be put into the envelope
        SoapObject soapObject = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
        envelope.setOutputSoapObject(soapObject);

        //put something on the card  
        PropertyInfo propertyInfo = new PropertyInfo();
        propertyInfo.setType(PropertyInfo.STRING_CLASS);
        propertyInfo.setName("macAddress");
        propertyInfo.setValue(macAddress);
        soapObject.addProperty(propertyInfo);

        //call WebService
        try {
            HttpTransportSE httpTransportSE = new HttpTransportSE(SOAP_ADDRESS);
            httpTransportSE.debug = true;
            httpTransportSE.call(SOAP_ACTION, envelope);
            Object response = envelope.getResponse();
            return response.toString();             
        } catch (Exception e) {
            String text = "Oops!! App has crashed with exception: "+e.getMessage() + "\n" + "Stack trace below:\n";
            StackTraceElement[] stackTrace = e.getStackTrace();
            for (StackTraceElement stackTraceElement : stackTrace) {
                text += stackTraceElement.toString() + "\n";
            }
            return text;
        }
    }

    @Override
    protected void onPostExecute(String result) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
        TextView textView = (TextView)findViewById(R.id.textView1);
        textView.setText(result);
    }

}

AsyncTask を呼び出すには、次のようにします。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new AsyncTaskWebServiceCaller().execute();
}
于 2013-03-27T14:58:02.720 に答える