【问题标题】:Trying to create a custom layout with XML parsing. Error尝试使用 XML 解析创建自定义布局。错误
【发布时间】:2013-11-29 20:28:19
【问题描述】:

我一直在关注这个关于创建自定义布局和 XML 解析的教程。我以自己的方式对其进行了重组,但不幸的是。应用程序在我单击将其引导至使用 XML 查看自定义布局的活动的按钮时崩溃。会不会是网络错误?还是解析错误?或打开活动错误。无论哪种方式,它都会崩溃。而 Logcat 似乎同时发布了所有这些问题。

Logcat:

11-29 15:14:07.347:E/AndroidRuntime(1133):致命异常:主要 11-29 15:14:07.347:E/AndroidRuntime(1133):进程:com.example.clinicbooker,PID:1133 11-29 15:14:07.347: E/AndroidRuntime(1133): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.clinicbooker/com.example.clinicbooker.BookScreen}: android.os.NetworkOnMainThreadException 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread.access$700(ActivityThread.java:135) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.os.Handler.dispatchMessage(Handler.java:102) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.os.Looper.loop(Looper.java:137) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread.main(ActivityThread.java:4998) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 java.lang.reflect.Method.invokeNative(Native Method) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 java.lang.reflect.Method.invoke(Method.java:515) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 11-29 15:14:07.347: E/AndroidRuntime(1133): at dalvik.system.NativeStart.main(Native Method) 11-29 15:14:07.347:E/AndroidRuntime(1133):由:android.os.NetworkOnMainThreadException 引起 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 com.example.functionalities.XMLParser.getXmlFromUrl(XMLParser.java:45) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 com.example.clinicbooker.BookScreen.onCreate(BookScreen.java:43) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.Activity.performCreate(Activity.java:5243) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-29 15:14:07.347: E/AndroidRuntime(1133): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 11-29 15:14:07.347: E/AndroidRuntime(1133): ... 11 更多

我的屏幕在用户点击指向它的片段上的按钮时启动:

public class BookScreen extends Activity {

// All static variables
static final String URL = "https://dl.dropboxusercontent.com/u/42241589/test.xml";
// XML node keys
static final String KEY_CLINIC = "clinic"; // parent node
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_DATE = "date";
static final String KEY_TIME = "time";
static final String KEY_ADDRESS = "address";
static final String KEY_THUMB_URL = "thumb_url";
ListView list;
LazyAdapter adapter;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.book_main);
    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element
    NodeList nl = doc.getElementsByTagName(KEY_CLINIC);
    // looping through all song nodes &lt;song&gt;
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key =&gt; value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
        map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
        map.put(KEY_TIME, parser.getValue(e, KEY_TIME));
        map.put(KEY_ADDRESS, parser.getValue(e, KEY_ADDRESS));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
        // adding HashList to ArrayList
        songsList.add(map);
    }
    list = (ListView) findViewById(R.id.list);
    // Getting adapter by passing xml data ArrayList
    adapter = new LazyAdapter(this, songsList);
    list.setAdapter(adapter);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll()
        .build();
    StrictMode.setThreadPolicy(policy);
    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        }
    });
}

}

它的适配器:

public class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader;

    public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.book_list_row, null);

        TextView title = (TextView)vi.findViewById(R.id.menu_name); 
        TextView description = (TextView)vi.findViewById(R.id.address); 
        TextView bookingDate = (TextView)vi.findViewById(R.id.book_date); 
        TextView bookingTime = (TextView)vi.findViewById(R.id.book_time);
        ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); 

        HashMap<String, String> song = new HashMap<String, String>();
        song = data.get(position);

        // Setting all values in listview
        title.setText(song.get(BookScreen.KEY_TITLE));
        description.setText(song.get(BookScreen.KEY_ADDRESS));
        bookingDate.setText(song.get(BookScreen.KEY_DATE));
        bookingTime.setText(song.get(BookScreen.KEY_TIME));
        imageLoader.DisplayImage(song.get(BookScreen.KEY_THUMB_URL), thumb_image);
        return vi;
    }
}

【问题讨论】:

    标签: java android xml android-layout


    【解决方案1】:

    String xml = parser.getXmlFromUrl(URL);

    把它放在一个 AsyncTask 中。不要直接在 UI 线程中使用它。这是你的例外NetworkOnMainThreadException

    asynctask的例子很多,用一个吧。

    【讨论】:

    • 我已经实现了一个 Asyntask,它运行得很好。谢谢!
    【解决方案2】:

    引起:android.os.NetworkOnMainThreadException 11-29

    您无法从 UI 线程访问您的数据库。试试异步任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多