【问题标题】:Android : how to execute AsyncTask?Android:如何执行 AsyncTask?
【发布时间】:2012-07-12 12:24:09
【问题描述】:

我必须在我的应用程序中加载 XML 数据,我在我的活动类的子类中这样做,像这样扩展 AsyncTask:

public class MyActivity extends Activity {

    ArrayList<Offre> listOffres;

    private class DownloadXML extends AsyncTask<Void, Void,Void>
    {
        protected Void doInBackground(Void... params)
        {
            listOffres = ContainerData.getFeeds();
            return null;
        }
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_liste_offres);

        DownloadXML.execute(); // Problem here !

        for(Offre offre : listOffres) { // etc }
    }
}

这里我不知道怎么用execute(),出现如下错误:

不能对非静态方法execute(Integer...)进行静态引用 来自 AsyncTask 类型

我猜是一些参数,但是什么?

谢谢。

【问题讨论】:

    标签: android xml android-asynctask


    【解决方案1】:

    您需要创建DonwloadXML 文件的实例并在该方法上调用execute()

    DownloadXML task=new DownloadXML();
    task.execute();
    

    编辑:您可能还应该从您的doInBackground() 返回listOffers,并在您的AsynTaskonPostExecute() 方法中处理该数组。你可以看看这个简单的AsyncTask tutorial

    【讨论】:

      【解决方案2】:

      你应该这样称呼它:

      new DownloadXML().execute();
      

      【讨论】:

        【解决方案3】:

        实际上,您正在调用 AsyncTask 的方法(它进一步扩展了 AsyncTask 类),而没有创建该类的 OBJECT。 你可以通过两种方式调用execute方法。

        1. 制作类的对象/实例

          DownloadXML task=new DownloadXML();
          task.execute();
          
        2. 通过使用飞行物体。

          new DownloadXML().execute();
          

        我更喜欢在这里使用第二种方法来做到这一点。

        【讨论】:

          【解决方案4】:

          如果你想通过 java 中的异步任务执行一些代码,你也可以这样做:

          AsyncTask.execute(new Runnable() {
                      @Override
                      public void run() {
          
                          // add code which you want to run in background thread
          
                          runOnUiThread(new Runnable() {
                              @Override
                              public void run() {
                                  // add code which you want to run in main(UI) thread
                              }
                          });
                      }
                  });
          

          而在 kotlin 中,如果您使用的是 anko,还有更简单的方法可以实现这一点:

            doAsync {
                      // add code which you want to run in background thread
                      uiThread {
                          // add code which you want to run in main(UI) thread
                      }
                  }
          

          【讨论】:

          【解决方案5】:

          你也可以执行你的异步任务

          new DownloadXML().execute();
          

           DownloadXML task=new DownloadXML();
           task.execute();
          

          你在 asynctask 的数组中得到的一件事比使用 postexeceute 方法进行循环迭代更好

          如下所示

            protected void onPostExecute(String s) {
          
              for(Offre offre : listOffres) { // do ur work here after feeling array }    
          
          
              }
          

          【讨论】:

            【解决方案6】:

            你必须先创建 DownloadXML 类的对象。

            DownloadXML downloadxml= new DownloadXML();
            downloadxml.execute();
            

            并返回 listOffres。

            listOffres = ContainerData.getFeeds();
            return listOffers;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多