2016-08-10 5 views
0

좋아요, 연구의 한계에 도달했기 때문에 첫 번째 게시물. 3 개의 요청을 실행하려고하면 for 루프 안에 다른 URL이 있습니다 (while 및 if로 시도했습니다) 코드가 완벽하게 실행되어 requestqueue에 도달 할 때까지 계속 실행됩니다. 이제 문제는 다음과 같습니다. 요청 큐 이후에 응답을 얻고 싶을 때만 for 루프를 다시 작성합니다.하지만 요청 큐를 추가 한 후 프로그램이 원하는 결과를 얻지 못하는 것 같습니다. 클래스는 다시 돌아갑니다. for 루프에 연결하고 마지막까지 전체 기능을 계속 수행하며 결국에는 응답을 3 회받습니다. 그리고 나는 매번 요청을 하나씩 원하기 때문에 저를 화나게합니다. 내가 전에 많은 요청을 수행하고, 나는이 문제를 해결하는 방법을 알고 있다고 생각하지만, 나는 = s의 코드 수 없습니다했습니다안드로이드 - 발리 요청 루프 내

public class MainActivity extends FragmentActivity { 

private String totalresults, word, results, server, userAgent, quantity, urly, nome; 
private int counter,limit; 
EditText nome_empresa; 
public TextView output; 
ProgressDialog PD; 
ViewPager viewPager=null; 
public ArrayList half_cards, all_cards; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    nome_empresa = (EditText) findViewById(R.id.nome_empresa); 
    output = (TextView) findViewById(R.id.output); 
    PD = new ProgressDialog(this); 
    PD.setMessage("Loading...."); 
    PD.setCancelable(false); 
    //viewPager = (ViewPager) findViewById(R.id.pager); 
    //FragmentManager fragmentManager = getSupportFragmentManager(); 
    //viewPager.setAdapter(new MyAdapterAlfa(fragmentManager)); 

} 



public void vamos(View view) { 
    nome = nome_empresa.getText().toString(); 
    PD.show(); 
    googlesearch(nome, 200, 0); 
    ListView lv = (ListView) findViewById(R.id.custom_list_view); 

    lv.setAdapter(new ArrayAdapter<String>(MainActivity.this, 
      android.R.layout.simple_list_item_1, all_cards)); 
    all_cards = get_cards(totalresults, nome); 
    PD.dismiss(); 

} 

public void googlesearch(String worde, int limite, int start) { 
    word = worde; 
    results = ""; 
    totalresults = ""; 
    server = "www.google.com"; 
    userAgent = "(Mozilla/5.0 (Windows; U; Windows NT 6.0;en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6"; 
    quantity = "100"; 
    counter = start; 
    limit = limite; 
    do_search(); 
} 

public void do_search() { 

    for(int l=counter; l<=limit; l+=100){ 
     urly = "http://" + server + "/search?num=" + quantity + "&start=" + Integer.toString(counter) + "&hl=en&meta=&q=%40\"" + word + "\""; 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 
     StringRequest strReq = new StringRequest(Request.Method.GET, urly, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        half_cards = get_cards(response, word); 
        all_cards.addAll(half_cards); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.e("Error: " + error.getMessage()); 
      } 
     }); 
      requestQueue.add(strReq); 
    } 
} 

public ArrayList get_cards(String ola, String ole){ 
    myparser rawres = new myparser(ola, ole); 
    return rawres.cards(); 
} 

}

+1

'Volley'는 비동기 적으로 실행됩니다. 즉, 다른 코드가 계속 실행되는 동안 자체 스레드에서 실행됩니다. 따라서 'Volley 응답'을 기다리지 않으면 for 루프를 다시 시작합니다. 'onResponse' 메쏘드 안에서'do_search'를 호출하여'if 문'이 어떤'url'을 사용할지를 결정하십시오. –

답변

0

발리 요청이 너무 비동기는 응답은 다시 루프를 때 얼마 전에 끝났습니다. 요청 대기열을 수행하려면 재귀 적이어야합니다. 이전 요청에 대한 응답으로 다음 요청 호출을 실행하십시오.