0

我有这个类和简单的静态 {} 方法的问题:

 package com.example.tabletapp1.dummy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.StrictMode;
import android.util.Log;

public class DummyContent {

    public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
    public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
    public static ArrayList<HashMap<String, String>> stireList = new ArrayList<HashMap<String, String>>();

    static {   /////// THIS FUNCTION
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();

        StrictMode.setThreadPolicy(policy);

        String url = "http://kosalis.beclenar.ro/stiri.txt";

        // JSON Node names
        String TAG_STIRE = "stire";
        String TAG_ID = "ID";
        String TAG_NUME = "Nume";
        String TAG_DESCRIERE = "Descriere";
        String TAG_POZA = "Poza";
        String TAG_CORP_STIRE_HTML = "Corp_stire_html";

        // contacts JSONArray
        JSONArray news = null;

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        JSONObject json = jParser.getJSONFromUrl(url);

        try {
            // Getting Array of Contacts
            news = json.getJSONArray(TAG_STIRE);

            // looping through All Contacts
            for (int i = 0; i < news.length(); i++) {
                JSONObject c = news.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String name = c.getString(TAG_NUME);
                String description = c.getString(TAG_DESCRIERE);
                String poza = c.getString(TAG_POZA);
                String body_html = c.getString(TAG_CORP_STIRE_HTML);

                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_NUME, name);
                map.put(TAG_DESCRIERE, description);
                map.put(TAG_POZA, poza);

                // adding HashList to ArrayList
                stireList.add(map);
                addItem(new DummyItem(id, name, description, poza, body_html));

            }
        } catch (JSONException e) {
            Log.e("Error2", TAG_CORP_STIRE_HTML);
            e.printStackTrace();
        }
    }

    private static void addItem(DummyItem item) {
        ITEMS.add(item);
        ITEM_MAP.put(item.id, item);
    }

    public static class DummyItem {
        public String id;
        public String title;
        public String description;
        public String content;
        public String photo;

        public DummyItem(String id, String title, String description,
                String photo, String content) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.photo = photo;
            this.content = content;
        }

        @Override
        public String toString() {
            return title;
        }
    }
}

但我不知道如何执行 MainActivity 的静态 { } 函数中的内容。我想从我的 mainactivity 中调用一个 asynctask,因为每次我的应用程序启动时,UI 都会冻结,我确信这是因为创建 JSONPArser 类的静态函数:

    package com.example.tabletapp1.dummy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {
    }

    public JSONObject getJSONFromUrl(String url) {
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

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

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "ISO-8859-2"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }
}

我还有一个问题:假设我有一个 AsyncTask,在 doInBackground() 中我调用 JSONParser 类,这是否会冻结 UI?

4

2 回答 2

2

您没有定义静态方法,而是定义了静态初始化程序;当对象被实例化时它会自动运行。使它成为一个实际的方法(使用 static 关键字),您将能够调用它。

至于你的另一个问题:它与第一个无关;为它创建一个单独的问题。

于 2013-08-25T11:55:33.207 回答
1

您将要替换static {static void staticMethod() {. 然后你可以用DummyContent.staticMethod().

编辑:@Mah 对多个问题提出了一个很好的观点。如果您创建一个新的,请告诉我,我可以为您移动我的部分答案。

至于 Asynctask,它确实非常适合此类工作,因为在其中完成的任何操作doInBackground()都不会阻塞 UI 线程。对我来说,它有一些学习曲线,但我发现它是一门非常有用的课程。要使用下面的示例,您可以调用new myAsyncTask().execute(url)

class myAsyncTask extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected Boolean doInBackground(String... url) {
        // This will receive the String you passed into it and return a boolean to onPostExecute()
        // Put all your CPU intensive stuff here

        // publishProgress can be used update the UI thread
        Integer progress = 1;
        publishProgress(progress);

        return true;
    }

    @Override
    protected void onProgressUpdate(Integer... doInBackgroundResult) {
        super.onProgressUpdate(doInBackgroundResult);
        // Anything done here can update the UI but will block
    }

    @Override
    protected void onPostExecute(Boolean doInBackgroundResult) {
        super.onPostExecute(doInBackgroundResult);
        // Runs after doInBackground finishes
        // Anything done here will block the UI
    }
}
于 2013-08-25T12:13:51.760 回答