2016-07-16 47 views
0

我有一個ListView顯示從OMDBAPI搜索電影標題,當點擊搜索BTN我需要點擊兩次indstead一次。JSONParser到ListView需要雙重

請幫忙。

下面的代碼:

public class JSONParser extends AsyncTask<String, String, String> { 

    static ArrayList<String> movieList = new ArrayList<>(); 

    @Override 
    protected String doInBackground(String... params) { 

     HttpURLConnection httpURLConnection = null; 
     BufferedReader reader = null; 
     StringBuilder builder = new StringBuilder(); 

     try { 

      URL url = new URL(params[0]); 
      httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.connect(); 
      InputStream stream = httpURLConnection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      String line = ""; 
      while ((line = reader.readLine()) != null){ 
       builder.append(line); 

      } 
      return builder.toString(); 


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

     finally { 
      if(httpURLConnection != null){ 
       httpURLConnection.disconnect(); 
      } 
      try { 
       if (reader != null){ 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return "Failed Connection"; 
    } 



    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     try { 
      JSONObject jsonObject = new JSONObject(result); 
      JSONArray jsonArray = jsonObject.getJSONArray("Search"); 
      StringBuilder stringBuilder = new StringBuilder(); 
      for (int i = 1; i<jsonArray.length(); i++){ 
       JSONObject finalJsonObject = jsonArray.getJSONObject(i); 
       String titleOfMovie = finalJsonObject.getString("Title"); 
       movieList.add(titleOfMovie); 
       stringBuilder.append(movieList); 
       finalJsonObject.get("Title"); 

      } 


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

    } 
} 

這裏的mainActivivty:

public class Main2ActivityWeb extends AppCompatActivity { 

    EditText searchBar; 
    ListView listOfMovies; 
    Button searchBtn; 
    Button deleteBtn; 
    ArrayAdapter<String> arrayAdapter; 
    String url = "http://www.omdbapi.com/?s="; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2_activity_web); 

     searchBar = (EditText) findViewById(R.id.etsearch); 
     listOfMovies = (ListView) findViewById(R.id.lvMovies); 
     searchBtn = (Button) findViewById(R.id.btnSearch); 
     deleteBtn = (Button) findViewById(R.id.btnClear); 

     searchBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       arrayAdapter = null; 
       final String search = url + searchBar.getText().toString(); 
       new JSONParser().execute(search); 
       ArrayList<String> list = new ArrayList<>(JSONParser.movieList); 
       arrayAdapter = new ArrayAdapter<>(Main2ActivityWeb.this, 
         android.R.layout.simple_list_item_1, list); 
       listOfMovies.setAdapter(arrayAdapter); 
       if (arrayAdapter !=null){ 
        JSONParser.movieList.clear(); 
       } 



      } 
     }); 

     deleteBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listOfMovies.setAdapter(null); 
       JSONParser.movieList.clear(); 
       searchBar.setText(""); 
      } 
     }); 


    } 
} 
+0

使用排的JSONObjectRequest。比使用AsyncTask容易得多。 –

回答

0

你的問題是,你似乎不明白的的AsyncTask是asyncronous的概念,所以

new JSONParser().execute(search); 

不會存儲任何東西到JSONParser.movieList,直到onPostExecute完成。

同時,你繼續同步運行

ArrayList<String> list = new ArrayList<>(JSONParser.movieList); 

這是最有可能空第一次單擊該按鈕,因爲你還在等待的AsyncTask在後臺完成解析JSON。

在第二次點擊按鈕時,您將開始一個新的JSON請求,但您看到的結果來自第一個請求。


一個對付這樣的回調,像排球,改造/ OkHttp會做,但你也可以將你使用,讓他們以正確的順序執行物體周圍。例如,給的而不是它保持它的AsyncTask一個ArrayAdapter自己的ArrayList

private ArrayList<String> list; 

... 

onCreate() { 
    listOfMovies = (ListView) findViewById(R.id.lvMovies); 
    list = new ArrayList<>(); 
    arrayAdapter = new ArrayAdapter<>(Main2ActivityWeb.this, 
         android.R.layout.simple_list_item_1, list); 
    listOfMovies.setAdapter(arrayAdapter); 

... 
    onClick() { 
     ... 
     new JSONParser(arrayAdapter).execute(search); 
    } 
} 

在的AsyncTask

public class JSONParser extends AsyncTask<String, String, String> { 

    private ArrayAdapter<String> adapter; 

    public JSONParser(ArrayAdapter<String> adapter) { 
     this.adapter = adapter; 
    } 

    ... 

    onPostExectute() { 
     for (...) { 
      adapter.add(titleOfMovie); 
     } 
     apdater.notifyDataSetChanged(); 
    } 
}