AsyncTask:如何处理DoInBackground的结果?

时间:2012-03-07 13:44:42

标签: android android-asynctask preferenceactivity

我有一个PreferenceActivity从Web服务获取数据(呼叫前转号码,语音邮件状态等)

该课程如下:

public class SettingsActivity extends PreferenceActivity
{
UserController userControl;
ListPreference lp;
public SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    userControl = new UserController(getParent());
    addPreferencesFromResource(R.layout.settings);

    new PullNumbersTask().execute();

}

   private class PullNumbersTask extends AsyncTask<Void, Void, String[]>
{
    private ProgressDialog Dialog;
    private String[] numbers;
    private boolean vmStatus;
    private String[] cfInfo;
    public PullNumbersTask()
    {
         Dialog = new ProgressDialog(getParent());
         Dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    }


    protected void onPreExecute() 
    {
        Dialog.setMessage("Henter brugerindstillinger..");
        Dialog.show();
    }

    @Override
    protected String[] doInBackground(Void... arg0) 
    {
        numbers = userControl.GetNumbers(); // Returns a String array containing available numbers
        Dialog.setProgress(30);
        vmStatus = userControl.GetVoicemailStatus(); // Returns a boolean containing voicemail status(enabled/disabled)
        Dialog.setProgress(80);
        cfInfo = userControl.GetCallForwardInfo(); // Returns a String array containing Call forward info.
        Dialog.setProgress(100);

        return null;
    }



     protected void onPostExecute(String[] result) 
     {
        lp = (ListPreference) findPreference("shownumber_list");
        lp.setEntries(result);
        lp.setEntryValues(result);
        Dialog.dismiss();
     }

}

我决定要一个AsyncTask调用来执行所有的Web服务调用 - 但是如何设置我的首选项数据onPostExecute?

2 个答案:

答案 0 :(得分:1)

不是使用String[]作为doInBackground()方法的返回值,而是在AyncTask中定义一个类,其中包含您需要传递给onPostExecute()方法的字段

此外,您应该避免直接从doInBackground()更新进度对话框,因为它不会在UI线程中执行。 AsynClass可以将参数传递给onProgressUpdate()方法,以反映后台执行进度的变化。

此处有更多详情:http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

doInBackground 返回的内容将作为参数传递给 onPostExecute

因此,请从 doInBackground 中的Web服务中获取您的首选项,然后将其作为字符串数组返回。

onPostExecute 将该String Array作为参数。然后应用首选项。