асинхронное зависание ProgressBar в j

Я использую асинхронную библиотеку j для post/get (пробовал со своей собственной, произошло то же самое), и я продолжаю сталкиваться с проблемой. Мой ProgressBar (неопределенный) продолжает зависать, когда я вызываю метод getNews(). Что я здесь делаю неправильно?

protected static ArrayList<HashMap<String, String>> allNews = new ArrayList<HashMap<String, String>>();

public void getNews() throws JSONException
{

    VestiHTTPClient.get("json.php", null, new JsonHttpResponseHandler()
    {

        @Override
        public void onSuccess(JSONArray news)
        {
            try
            {
                for(int i=0; i<news.length(); i++)
                {
                    JSONObject jo = (JSONObject) news.get(i);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("POST_URL", jo.getString("POST_URL"));
                    map.put("TOPIC_TITLE", jo.getString("TOPIC_TITLE"));
                    map.put("AUTHOR", jo.getString("AUTHOR"));
                    map.put("CATEGORY", jo.getString("CATEGORY"));
                    map.put("POST_TIME", jo.getString("POST_TIME"));
                    map.put("POST_TEXT", jo.getString("POST_TEXT"));
                    map.put("IMAGE", jo.getString("IMAGE"));

                    allNews.add(map);                       
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }

        @Override
         public void onFinish() {
            Intent main = new Intent(SplashScreen.this, MainWindow.class);
            SplashScreen.this.startActivity(main);
            SplashScreen.this.finish();
         }
    });

}

Все срабатывает правильно (onSuccess, onFinish), но мой ProgressBar продолжает зависать (даже пытался запустить его в отдельном потоке...).

У кого-нибудь есть идеи?


person Vedran Kopanja    schedule 24.12.2012    source источник
comment
вы пробовали это с помощью asynctask?   -  person ρяσѕρєя K    schedule 24.12.2012
comment
Да, как я сказал в скобках, я попробовал свой собственный способ (с классом, расширяющим AsyncTask).   -  person Vedran Kopanja    schedule 24.12.2012
comment
хорошо, с какой проблемой вы столкнулись при использовании AsyncTask? если вы получаете какую-либо ошибку при реализации текущего кода с помощью AsyncTask, пожалуйста, поделитесь журналом ошибок, а также с интегрированным AsyncTask.   -  person ρяσѕρєя K    schedule 24.12.2012
comment
В том-то и дело, что у меня нет ошибок, проблема в том, что мой Progress Bar зависает, когда работает AsyncTask, и я понятия не имею, почему...   -  person Vedran Kopanja    schedule 24.12.2012
comment
если вы опубликуете код с интеграцией AsyncTask, мы постараемся помочь вам и выяснить текущую проблему   -  person ρяσѕρєя K    schedule 24.12.2012
comment
Итак, кажется, я делал это неправильно :), я загружал только JSON в классе SplashScreen, а затем загружал картинки в классе MainWindows, поэтому это не сработало... Я попытаюсь исправить это завтра, я слишком устал сейчас. Опубликую решение, если сделаю.   -  person Vedran Kopanja    schedule 25.12.2012


Ответы (1)


Наконец-то заработало! Я использовал AndroidQuery (пример ListView) для загрузки и кэширования изображений (работает Очень хорошо).

Сначала создайте статические переменные в действии A (моя активность SplashScreen)

protected static ArrayList<HashMap<String, String>> allNews = new ArrayList<HashMap<String, String>>();
protected static ArrayList<JSONObject> items = new ArrayList<JSONObject>();

Затем с помощью AsyncTask возьмите всю необходимую информацию JSON и заполните оба ArrayLists, а onPostExecute создайте другую активность (MainWindow в моем случае).

    @Override
    protected Integer doInBackground(String[]... params) {



        try
        {
            String address = "http://your.file.here";

            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(address);

            try
            {

                HttpResponse response = client.execute(post);
                Log.w("RESPONSE", response.toString());

                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent(), "UTF-8"));
                String sResponse;

                while ((sResponse = reader.readLine()) != null) {
                    result = result.append(sResponse);
                }

                reader.close();

                JSONArray news = new JSONArray(result.toString());
                int count = news.length();

                for(int i=0; i<news.length(); i++)
                {
                    JSONObject jo = (JSONObject) news.get(i);
                    joNews.add(jo);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("POST_URL", jo.getString("POST_URL"));
                    map.put("TOPIC_TITLE", jo.getString("TOPIC_TITLE"));
                    map.put("AUTHOR", jo.getString("AUTHOR"));
                    map.put("CATEGORY", jo.getString("CATEGORY"));
                    map.put("POST_TIME", jo.getString("POST_TIME"));
                    map.put("POST_TEXT", jo.getString("POST_TEXT"));
                    map.put("IMAGE", jo.getString("IMAGE"));

                    allNews.add(map);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return 1;
    }

     protected void onPostExecute(Integer result) {
         Intent main = new Intent(SplashScreen.this, MainWindow.class);
         SplashScreen.this.startActivity(main);
         SplashScreen.this.finish();
     }

Наконец, просто инициализируйте переменные в своем действии B (моем действии MainWindow) и используйте AndroidQuery для их загрузки в ListView!

private ArrayList<HashMap<String, String>> allNews = new ArrayList<HashMap<String, String>>();
private ArrayList<JSONObject> items = new ArrayList<JSONObject>();

    allNews = SplashScreen.allNews;
    items = SplashScreen.joNews;

    ArrayAdapter<JSONObject> aa = new ArrayAdapter<JSONObject>(this, R.layout.main_news_items, items){

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

                if(convertView == null){
                        convertView = getLayoutInflater().inflate(R.layout.main_news_items, null);
                }

                JSONObject jo = getItem(position);

                AQuery aq = new AQuery(convertView);
                aq.id(R.id.name).text(jo.optString("TOPIC_TITLE", "No Title"));
                aq.id(R.id.title).text(jo.optString("CATEGORY", ""));

                String tb = jo.optString("IMAGE");
                if(tb.equals(""))
                    tb = "http://default.image.here";
                aq.id(R.id.profile_img).progress(R.id.progress).image(tb, true, true, 0, 0, null, AQuery.FADE_IN_NETWORK, 1.0f);


                return convertView;

        }
    };

    ListView news = (ListView) findViewById(R.id.listView1);
    news.setAdapter(aa);
    news.setTextFilterEnabled(true);

Надеюсь, это поможет кому-то!

person Vedran Kopanja    schedule 25.12.2012