有人能告诉我为什么这会导致我的应用程序崩溃吗?同样的代码也适用于我的其他应用程序,这就是为什么我很困惑。
我要做的是告诉我的应用程序转到http://omarcomputerservices.com/cartoons/cartoons.php?getCartoon&ID=1,然后从'*'字符拆分解析字符串。然后将其添加到数组中。
我已经添加了上网权限。
package com.omarreyes.youtubechannels;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
public class StartingPoint extends Activity
{
ArrayList<String> images = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting_point);
Button get = (Button) findViewById(R.id.button1);
get.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener()
{
public void onClick(View v)
{
getImages();
}
};
private void getImages()
{
try
{
// Create a URL object
URL url = new URL("http://omarcomputerservices.com/cartoons/cartoons.php?getCartoon&ID=1");
// Read all of the text returned by the HTTP server
BufferedReader in = new BufferedReader
(new InputStreamReader(url.openStream()));
String htmlText;
while ((htmlText = in.readLine()) != null)
{
// Keep in mind that readLine() strips the newline characters
String[] data = htmlText.split("\*");
images.add(data[0].toString());
}
in.close();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
乍一看,我发现至少有一个原因导致你的应用程序崩溃- getImages()
方法试图在主(UI)线程上执行网络操作。
由于网络操作非常耗时,它们必须在自己的线程中运行。为了加强这一规则,从Android API Level 11开始,如果你试图在UI线程上执行网络操作,就会抛出一个NetworkOnMainThreadException
。
要解决这个问题,你应该把访问网络的代码放到一个单独的线程中,例如放到一个AsyncTask中。