1

我试图在我的 LoadPreview().execute 启动时禁用 onTouch(),因为如果用户点击触发我的 LoadPreview() 的按钮,将会有重复的预览按钮。所以我想在加载过程中禁用 onTouch() 。

有办法吗?

这是我的 ontouch 方法:

@Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    // TODO Auto-generated method stub

                    switch(arg1.getAction())
                    {
                    case MotionEvent.ACTION_DOWN:
                        adapter.clear();
                        new LoadPreview().execute();
                    break;
                    } 

                    return true;
                }   

             }
                );

             }

这是我的加载预览()

/**
     * Background Async Task to Load all product by making HTTP Request
     * */
    class LoadPreview extends AsyncTask<String, String, String> {

        /**
         * getting preview url and then load them
         * */
        protected String doInBackground(String... args) {


            // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                // getting JSON string from URL
                JSONObject json = jParser.makeHttpRequest(url_magazine, "GET", params);

                // Check your log cat for JSON reponse
                Log.d("All Products: ", json.toString());

                try {
                    // Checking for SUCCESS TAG
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // products found
                        // Getting Array of Products
                        mag = json.getJSONArray(TAG_MAGAZINE);

                        for (int i = 0; i < mag.length(); i++) {
                            JSONObject c = mag.getJSONObject(i);

                            // Storing each json item in variable
                            String magazinePreview = c.getString(TAG_MAGAZINE_PREVIEW);

                            previewList.add(magazinePreview);
                        }                   
                    } 
                    else {

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            for (int a = 0; a <= previewList.size(); a++)
            {           
                if(pos == a)
                {
            // Building Parameters
            List<NameValuePair> param = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json1 = jParser.makeHttpRequest(previewList.get(a), "GET", param);

            // CHECKING OF JSON RESPONSE
            Log.d("All guide: ", json.toString());

            try {
                preview = json1.getJSONArray(TAG_PREVIEWS);

                for (int i = 0; i < preview.length(); i++) {
                    JSONObject c = preview.getJSONObject(i);

                    String image = c.getString(TAG_IMAGE);

                    previewImagesList.add(image);
                    //System.out.println(guideList);
                }   

                // STOP THE LOOP
                break;

            } catch (JSONException e) {
                e.printStackTrace();
            }


            }

            }


            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {

        /**
         *  Updating parsed JSON data into ListView
        * */            
            adapter.notifyDataSetChanged();

        }
    }

onItemClick 方法:

coverFlow.setOnItemClickListener(new OnItemClickListener()
    {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            adapter.clear();
            File sdCard1 = Environment.getExternalStorageDirectory();
            File dir1 = new File (sdCard1.getAbsolutePath() + "/Futsing/issue"+issueNumber+"/"); 

                    /** IF FILE EXISTS **/
                    if(dir1.exists())
                    {
                        Intent intent = new Intent();
                        intent.setClass(CoverFlowExample.this, Reader.class);
                        intent.putExtra("issue", issueNumber);
                        startActivityForResult(intent, GET_INTENT_CODE);
                    }
                    else
                    {
                        if(process==false)
                        {
                            new LoadPreview().execute();
                            process = true;
                        }

                        else
                        {
                            process = false;
                        }
                    }
        }

    }

);
4

3 回答 3

1

照Gabe说的去做。你也可以像我解释的那样做。1.定义一个布尔值,如:

private boolean process = false;
  1. 覆盖 AsyncTask 中的 onPreExecution 等方法。
  2. 将布尔值放在上述方法上,将其值定义为 true。

    过程=真;

  3. 现在, onPostExecution 方法把这个:

    过程=假

  4. 并实现您的 onTouch 方法,如下所示:

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
    // TODO Auto-generated method stub
    
    if(process==false){
    
        switch(arg1.getAction())
        {
            case MotionEvent.ACTION_DOWN:
               adapter.clear();
               new LoadPreview().execute();
               break;
        } 
    
        return true;
        }   
        else{
          return false;
    }
    
    }                
    

    );

** 对于 onItenClick **

您可以使用下面的代码让 onItemClick 随心所欲地工作。

@Override
    public void onItemClick(AdapterView<?> arg0, View arg1,
            int arg2, long arg3) {

       if(process==false)
       {

        adapter.clear();
        File sdCard1 = Environment.getExternalStorageDirectory();
        File dir1 = new File (sdCard1.getAbsolutePath() + "/Futsing/issue"+issueNumber+"/"); 

                /** IF FILE EXISTS **/
                if(dir1.exists())
                {
                    Intent intent = new Intent();
                    intent.setClass(CoverFlowExample.this, Reader.class);
                    intent.putExtra("issue", issueNumber);
                    startActivityForResult(intent, GET_INTENT_CODE);
                }
                else
                {

                        new LoadPreview().execute();


                }
          }else{
                // nothing to do here it means the process is running
          }
    }

}
于 2013-01-18T03:48:10.340 回答
0

使用旗帜。在您的课程中放置一个布尔值 allowTouch。默认为真。当您想停止触摸时,请将其设置为 false。当您准备好再次触摸时,将其设置为 true。更改您的 onTouch 方法,使其仅在 allowTouch == true 时运行其中的代码。

于 2013-01-18T03:36:18.040 回答
0

使用boolean标志检查数据是否正在加载以防止重复调用。

声明一个 global boolean,例如:boolean loadingData;

然后,在您的onTouch()方法中,设置loadingPreview = true;

最后,在onPostExecute()AsyncTask 的方法中loadingPreview,切换loadingPreviewloadingPreview = false;

这将确保在它仍在执行此操作时不会生成重复的类来获取数据。切换状态将确保应用程序再次准备就绪。

编辑:不要忘记onTouch()在调用 AyncTask 之前检查方法中的状态loadingPreview

if (loadingPreview == false) {
    new LoadPreview().execute();
}
于 2013-01-18T03:40:54.280 回答