【问题标题】:Calling an async task from a button click in a listitem inside of a fragment通过单击片段内的列表项中的按钮调用异步任务
【发布时间】:2015-08-05 15:33:31
【问题描述】:

我的应用有一个 NavigationDrawer 活动,可以根据选择交换片段。其中一个片段包含一个带有几个按钮的列表视图。 listview 项目本身是不可选择的,但我需要处理按钮点击,我能够在我的自定义适配器中成功捕获。

这是我的问题:一些按钮点击需要触发异步任务来调用 REST api url。我不知道该怎么做。我尝试在我的片段上调用一个静态方法,该方法将实例化一个私有类的实例(扩展 AsyncTask),但这不起作用。我想过在我的自定义适配器中创建一个从 AsyncTask 扩展的私有类,但这感觉不对。这样做的正确方法是什么?

【问题讨论】:

    标签: android android-fragments android-listfragment


    【解决方案1】:

    与其他任何地方的异步任务没有什么不同。看看文档

    http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

    为你的任务创建一个类

     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }
    
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
    
     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
    }
    

    然后在你的 onClick 事件中创建它的一个实例

     new DownloadFilesTask().execute(url1, url2, url3);
    

    【讨论】:

    • 如果这个私有类是我的自定义适配器的一部分,这是否被认为是“糟糕的设计”?有没有更好的办法?
    • 我想说这在很大程度上取决于你想做什么。在我当前的项目中,我使用异步任务从 URL 获取图像,我在整个应用程序中都使用它。现在,由于这在任何地方都是相同的功能,所以我在我的主要活动中拥有它,作为一个静态类。我还有另一个更通用的任务,用于在我的服务器上调用不同的 API。有了这个,我在很多不同的地方使用它,但我已经实现了一个接口,这样我就可以覆盖 onPostExecute 来对这些数据做任何我需要的事情。希望这会有所帮助!
    【解决方案2】:

    这是扩展 Asynctask 的类

    public class webservice extends AsyncTask<Object, Object, Object>{
    
    private Context c;
    
    
    public webservice(int mode)
    {
    
    }
    
    
    public void set_context(Context c)
    {this.c =c;
    
    }
    
    
    public void call_webservice_login() 
    {
    // procedure to call webservice etc...
    
    
    
    }
    
    
    
    
    @Override
    protected Object doInBackground(Object... arg0) {
        // TODO Auto-generated method stub
    
         call_webservice_login();
        return 0;
    }
    
    
    
    
    protected void onProgressUpdate(Integer... progress) {
       //update your UI, etc
    }
    
    
    protected void onPreExecute(){ 
           super.onPreExecute();
                pgd = new ProgressDialog(c);
                pgd.setMessage("Loading...");
                pgd.show();    
        }
    
    
    protected void onPostExecute(Object result) {
     // TODO Auto-generated method stub
     super.onPostExecute(result);
    
    
    }
    
    }
    

    你可以这样称呼它。

    webservice wb1 = new webservice(1);
                //wb1.set_context(this);
                wb1.execute();
    

    【讨论】:

      【解决方案3】:

      为了拥有一个功能齐全的ListView,您需要一个适配器

      所以,这里最好的方法是:

      1. 在 Adapter 构造函数中,声明一个调用 AsyncTask 的 OnClickListener
      2. 在适配器的getView()方法中,将侦听器添加到必须执行任何操作的按钮:myButton.setOnClickListener(mListener)
      3. 如果您需要不同按钮的特殊参数,我建议在getView() 方法中为按钮添加一些使用myView.setTag(Object) 的标志或对象。监听器在调用的时候会收到一个View参数,也就是被点击的视图。只需在侦听器代码中使用 view.getTag() 即可确定按下了哪个按钮。

      【讨论】:

        猜你喜欢
        • 2019-11-09
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多