0

私はAndroidが初めてで、AsyncTaskを使用するのはこれが初めてです。ArrayList を返す非常に単純な Web サービスを作成しました。

package pk.mazars.basitMahmood.weatherReport;

public class WeekDays {

    private String name;
    private String weather;
    private float temperature;

    public  WeekDays(String name, String weather, float temperature) {      
        this.name = name;
        this.weather = weather;
        this.temperature = temperature;         
    } //end of constructor  
    //--------------Getters and Setters 
} //end of class WeekDays

public class WeatherReport {

    public ArrayList<WeekDays> weatherReport() {

        ArrayList<WeekDays> weatherList = new ArrayList<WeekDays>();
        weatherList.add(new WeekDays("Monday", "Cloudy", 29.5F));
        weatherList.add(new WeekDays("Tuesday", "Normal", 32.3F));
        weatherList.add(new WeekDays("Wednesday", "Sunny", 37.7F));
        weatherList.add(new WeekDays("Thursday", "Cold", 20.2F));
        weatherList.add(new WeekDays("Friday", "Normal", 31.4F));
        weatherList.add(new WeekDays("Saturday", "Rainy", 22.6F));
        weatherList.add(new WeekDays("Sunday", "Rainy", 27.9F));

        return weatherList;     
    }
} //end of class WeatherReport 

次に、Android側でコードを使用しました

public class MainActivity extends Activity {

    Button btnStart;
    MyTask objMyTask;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        btnStart = (Button) findViewById(R.id.btnstart);
        btnStart.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {

                objMyTask = new MyTask(MainActivity.this);              
                objMyTask.execute();                
            }           
            }); //end of anonymous class        
        } //end of onCreate()    
    } //end of class MainActivity

そしてここに私の仕事があります

public class MyTask extends AsyncTask<Void, Void, ArrayList<?>> {

    ProgressDialog dialog = null;
    Object result = null;
    MainActivity mainActivity;

    public MyTask(MainActivity mainActivity) {      
        this.mainActivity = mainActivity ;          
    }

    @Override
    protected void onPreExecute() {     
        super.onPreExecute();
        if (dialog == null) {           
            dialog = new ProgressDialog(mainActivity);          
        }           
        dialog.setMessage("Please Wait. Your authentication is in progress");       
        dialog.show();      
    } //end of onPreExecute()

    @Override
    protected ArrayList<?> doInBackground(Void... params) {     
        callWebService();           
        return null;        
    } //end of doInBackground()

    @Override
    protected void onPostExecute(ArrayList<?> result) {     
        super.onPostExecute(result);
        dialog.dismiss();   
    } //end of onPostExecute()

} //end of class MyTask

これがWebサービスメソッドです

 private void callWebService() {
    ...       
     try {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
        envelope.dotNet = false;
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION,envelope);

        result = envelope.getResponse();

        if (result instanceof ArrayList<?>) {               
            ArrayList<?> weatherList = (ArrayList<?>)result;                
            for (int i=0; i<weatherList.size(); i++)                    
                Object weekDay = weatherList.get(i);
                System.out.println();                   
            }

        } else {

        }

     } catch (SocketTimeoutException e) {            
         Toast.makeText(mainActivity, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show();

    }  catch(Exception e) {         
        e.printStackTrace();                            
     }      
} //end of callWebService()

ラインで

result = envelope.getResponse();

私は ArrayList のように取得します

ここに画像の説明を入力

しかし、リストからデータを取得する方法がわかりません。ライン到達後

if (result instanceof ArrayList<?>) {..}

コントロールはonPostExecute()メソッドに転送され、ここで結果が null になります。ArrayList から結果を取得した後にデータを入力するにはどうすればよいですか。また、callwebService メソッドにデータを入力しようとしています。onPostExecute(ArrayList<?> result)結果変数で ArrayLIst を取得するにはどうすればよいですか。私のメソッドは ArrayList を返し、戻り結果はonPostExecute()メソッドからdoInBackground()メソッドに転送されるためです。また、好きなものdoInBackground()をチェックできる方法でもisCancel()

@Override
protected Void doInBackground(Void... params) {     
    for (int i = 1; i <100; i++) {                  
        if (isCancelled()) {                
            break;              
        } else {                
            System.out.println(i);               
            callWebService();                                   
        }

    } //end of for()                
    return null;        
} //end of doInBackground()

しかし、ループの内部をチェックすると、callWebService()メソッドが 100 回呼び出されます。したがって、私の場合は isCancelled() メソッドを呼び出す必要があります。

ありがとう

4

2 に答える 2

1

メソッドは as として宣言する必要がprivate ArrayList<?> callWebService()あり、完了したらそのメソッドから arrayList を返す必要があります。

また、上記のように、結果オブジェクトが として返されるかどうかを確認する必要がありますVector。Vector として返される場合は、ArrayList に変更します。

最後に、doInBackroundAsyncTask のreturn nullコードを に変更する必要があります。これはreturn callWebService();callWebService()メソッドが上記の変更を加えた結果の ArrayList を返すためです。次にonPostExecute(ArrayList<?> result)、結果変数はnullではありませんが、Webサービスからの結果ArrayListを持ちます。

したがって、上記の変更を行うと、次のようになります。

private ArrayList<?> callWebService() {
...       
 try {

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    SoapSerializationEnvelope envelope = new    SoapSerializationEnvelope(SoapEnvelope.VER12);
    envelope.dotNet = false;
    envelope.setOutputSoapObject(request);

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    androidHttpTransport.call(SOAP_ACTION,envelope);

    result = envelope.getResponse();

    if (result instanceof ArrayList<?>) {               
        ArrayList<?> weatherList = (ArrayList<?>)result;                
        for (int i=0; i<weatherList.size(); i++)                    
            Object weekDay = weatherList.get(i);
            System.out.println();                   
        }

    } else {

    }

    return result;

 } catch (SocketTimeoutException e) {            
     Toast.makeText(mainActivity, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show();

}  catch(Exception e) {         
    e.printStackTrace();                            
 }      
 } //end of callWebService()

AsyncTask:

public class MyTask extends AsyncTask<Void, Void, ArrayList<?>> {

ProgressDialog dialog = null;
Object result = null;
MainActivity mainActivity;

public MyTask(MainActivity mainActivity) {      
    this.mainActivity = mainActivity ;          
}

@Override
protected void onPreExecute() {     
    super.onPreExecute();
    if (dialog == null) {           
        dialog = new ProgressDialog(mainActivity);          
    }           
    dialog.setMessage("Please Wait. Your authentication is in progress");       
    dialog.show();      
} //end of onPreExecute()

@Override
protected ArrayList<?> doInBackground(Void... params) {     

    return callWebService();       
} //end of doInBackground()

@Override
protected void onPostExecute(ArrayList<?> result) {     
    super.onPostExecute(result);
    dialog.dismiss();   
} //end of onPostExecute()

} //end of class MyTask

次のような方法で、Vector を Array リストに変更できます。

ArrayList<WeekDays> arraylist = new ArrayList<WeekDays>();
Collectios.copy(arraylist, vector_containing_the_data);

編集(Basit) -------------------------------------------------- -----------------

@Override
protected void onPostExecute(Vector<?> result) {

    super.onPostExecute(result);

    if (result != null) {

        for (int i=0; i<result.size(); i++) {

            Object weekDay = result.get(i);

            if (weekDay instanceof SoapObject) {

                SoapObject weekDayObject = (SoapObject)weekDay;

                String objectName = weekDayObject.getName();  //WeekDays
                String dayName = weekDayObject.getProperty("name").toString();
                String weather = weekDayObject.getProperty("weather").toString();
                String temp = weekDayObject.getProperty("temperature").toString();

            } //end of if (weekDay instanceof SoapObject)

        } //end of for (int i=0; i<result.size();...)

    } //end of if (result != null)

    dialog.dismiss();

} //end of onPostExecute()

しかし、これは doBackGround() メソッドで、Bean に値を入力した後に行う必要があると思います。次に、onPostExecute() メソッドでその Bean を使用して、UIThread を更新する必要があります。しかし、このコードは私にとってはうまく機能しています。

于 2012-07-02T10:28:59.510 に答える
0

結果オブジェクトは、ArrayList ではなく、Vector として返されます。

次のように変更してみてください。

  if (result instanceof Vector) {               
            Vector weatherList = (Vector)result;   

そして、どこにでも行けるかどうかを確認してください。

于 2012-07-02T10:16:19.750 に答える