问题
I'm trying to fetch data from the internet by using HttpGet and HttpClient. However, when I run it in my emulator it immediately shutdown saying "Unfortunately, AppName has stopped". Any ideas how to solve this?
The Code:
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
回答1:
android.os.NetworkOnMainThreadException
This means that you are doing network related calls on your Main UI
thread.
All Http related calls in your onCreate()
have to be moved to an AsyncTask.
回答2:
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
}
}
Use the above for AsyncTask
As an alternative you can have a look at this open source project in githup which uses robospice for long running operations. https://github.com/octo-online/robospice.
回答3:
Here is the great example by vogela to understand how to use AsynckTask in android.
You can go threw it and put your network relatd call in doBackground of that task.
Hope you got the point.
来源:https://stackoverflow.com/questions/15286456/android-app-stopped-when-try-to-fetch-data-from-internet