1

ユーザーが LoadPreview() をトリガーするボタンをタップすると、プレビュー ボタンが重複するため、LoadPreview().execute の起動時に 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;
                }   

             }
                );

             }

これは私の loadpreview() です

/**
     * 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

ゲイブの言うとおりにする。ここで説明したようなこともできます。1. 次のようなブール値を 1 つ定義します。

private boolean process = false;
  1. AsyncTask で onPreExecution のようなメソッドをオーバーライドします。
  2. 上記のメソッドにブール値を設定し、その値を true に定義します。

    プロセス = 真;

  3. さて、onPostExecution メソッドはこれを置きます:

    プロセス = false

  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 を配置します。デフォルトは true です。タッチを止めたいときは false に設定します。もう一度タッチする準備ができたら、true に設定します。allowTouch == true の場合にのみコードを実行するように onTouch メソッドを変更します。

于 2013-01-18T03:36:18.040 に答える
0

フラグを使用してboolean、データがロードされているかどうかを確認し、呼び出しの重複を防ぎます。

booleanたとえば、次のように global を宣言します。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 に答える