在AsyncTask中

时间:2016-09-15 17:31:15

标签: android android-layout android-asynctask

我已经在这里关注了一些线索,但即使我觉得它与示例相匹配而且我不知道为什么,我也无法使用它。

我创建了一个简单的微调器..在我的AsyncTaskRunner类中,我从REST API中提取信息,然后在onPostExecute中尝试将其添加到Spinner ..但是当我调试/运行我的应用时,Spinner内容为空。调试时,webChannelList肯定不是空的并且有内容

如果我不尝试动态添加任何内容,只需在onCreate方法中手动添加内容就可以了。但是出于实际目的,我试图动态地进行操作。

所以说要通过我做过的MainActivity ..但它不起作用。救命啊!

解决方案:我的doInBackground函数中有Debug.waitForDebugger(); ...一旦我删除它就完美了。

<Spinner
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/singularSpinner" />

我省略了与我要求的内容无关的内容

public class MainActivity extends AppCompatActivity {

  // Global Variables
  private List<String> webChannelList = new ArrayList<String>();
  private Spinner spinner;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      // Load Singular Web Channels into GUI
      AsyncTaskRunner runner = new AsyncTaskRunner(this);
      runner.execute();
  }

  class AsyncTaskRunner extends AsyncTask<Void, Void, Void> {

      MainActivity mainActivity;

      @Override
      protected Void doInBackground(Void... params) {
        Debug.waitForDebugger();  //REMOVING THIS WORKS            
        webChannelList = StuffFromAPI();
        return null;
      }

      @Override
      protected void onPostExecute(Void result) {
        if (!webChannelList.isEmpty()) {
          spinner = (Spinner) findViewById(R.id.singularSpinner);

          // Creating adapter for spinner
          ArrayAdapter<String> dataAdapter =
                new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList);

          // Drop down layout style - list view with radio button
          dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

          // Attaching data adapter to spinner
          spinner.setAdapter(dataAdapter);
      }
    }
  }
}

编辑:所以我省略了StuffFromAPI()函数,只是手动添加了webChannelList.add(“hello”);例如,它从StuffFromAPI()函数完美运行..奇怪的是,即使我只是将其注释掉并手动添加内容。几乎像它的缓存?但现在我无法复制它......所以有些事情正在发生,我不知道是什么。我是Android开发的新手,也许有一些我很想念的东西。我所做的就是去Build - &gt;运行或构建 - &gt;调试,我有一个平板电脑

编辑2: onPostExecute函数是否可能在从我的API中获取项目之前运行?这仍然没有意义,因为我在调试时实际看到了那里的内容,但它仍未在GUI中显示

1 个答案:

答案 0 :(得分:1)

Edit2 的回复:是的,这可能取决于您的API调用是否异步。您应该检查返回的数组列表的大小。你是如何获取数据的?

这不是你的问题,但我建议你安排你的代码有点不同。

为ArrayAdapter和响应数据列表webChannelList创建成员。然后在onPostExecute中,您需要做的就是调用通知数据已更改。这样更灵活,更容易维护。

ArrayList<someType> webChannelList = new ArrayList<>();

protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            spinner = (Spinner) findViewById(R.id.singularSpinner);

            // Creating adapter for spinner
            dataAdapter = new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList);

            // Drop down layout style - list view with radio button
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            // Attaching data adapter to spinner
            spinner.setAdapter(dataAdapter);

            // Load Singular Web Channels into GUI
            AsyncTaskRunner runner = new AsyncTaskRunner(this);
            runner.execute();
        }

        class AsyncTaskRunner extends AsyncTask<Void, Void, Void> {

            MainActivity mainActivity;

            @Override
            protected Void doInBackground(Void... params) {
                webChannelList = StuffFromAPI();
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                dataAdapter.notifyDataSetChanged();

            }
        }