我正在尝试使用HttpGet和HttpClient从互联网上获取数据。但是,当我在我的模拟器中运行它时,立即关闭说“不幸的是,AppName已停止”。任何想法如何解决这个问题?
守则:
public class MainActivity extends Activity {
final String httpPath = "http://www.google.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtContent = (TextView) findViewById(R.id.txtContent);
TextView tvHttp = (TextView) findViewById(R.id.tvHttp);
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(httpPath);
try {
HttpEntity httpEntity = httpclient.execute(httpget).getEntity();
if (httpEntity != null){
InputStream inputStream = httpEntity.getContent();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
inputStream.close();
tvHttp.setText(stringBuilder.toString());
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
AssetManager assetManager = getAssets();
// To load text file
InputStream input;
try {
input = assetManager.open("dummytext.txt");
int size = input.available();
byte[] buffer = new byte[size];
input.read(buffer);
input.close();
// byte buffer into a string
String text = new String(buffer);
txtContent.setText(text);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
logcat的:
03-08 03:31:17.762: D/AndroidRuntime(892): Shutting down VM
03-08 03:31:17.762: W/dalvikvm(892): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-08 03:31:17.952: E/AndroidRuntime(892): FATAL EXCEPTION: main
03-08 03:31:17.952: E/AndroidRuntime(892): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appname/com.example.appname.MainActivity}: android.os.NetworkOnMainThreadException
答案 0 :(得分:1)
android.os.NetworkOnMainThreadException
这意味着您正在Main UI
主题上进行与网络相关的调用。
onCreate()
中所有 Http 相关的来电都必须移至AsyncTask
。
答案 1 :(得分:0)
class DownloadTask extends AsyncTask<Void,Void,Void>
{
protected void onPreExecute()
{
super.onPreExecute();
//show progress dialog()
}
@Override
protected Void doInBackground(Void... params) {
//get data form internet here
// put all downloading related code in a method getDownload()
// call getDownload() here
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//dismiss dialog update ui here
// uodate ur ui with the downloaded data here
}
}
将以上内容用于AsyncTask
作为替代方案,您可以在githup中查看这个开源项目,该项目使用robospice进行长时间运行。 https://github.com/octo-online/robospice
答案 2 :(得分:0)