2013-03-08 81 views
0

我试图通过使用HttpGet和HttpClient从互联网获取数据。但是,当我在仿真器中运行它时,它立即关闭并说“不幸的是,AppName已停止”。任何想法如何解决这个问题?尝试从互联网获取数据时Android App停止

验证码:

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

这意味着,你在做你的Main UI线程网络相关的调用。

所有onCreate()的Http有关的呼叫必须被移动到AsyncTask

+0

如何将它移动到AsyncTask? – user2146966 2013-03-08 04:04:05

+0

我提供的链接有关于'AsyncTask'的所有基本信息。一旦你知道了,移动'doInBackground()'中与'Http'(** Internet **)相关的所有代码片段,并在'onCreate()'中调用'AsyncTask'的execute()'。 – SudoRahul 2013-03-08 04:07:03

+0

检查[这个例子](http://www.javasrilankansupport.com/2012/11/asynctask-android-example-asynctask-in.html),如果你喜欢。 – SudoRahul 2013-03-08 04:08:05

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

0

Here是vogela了解如何在android中使用AsynckTask的绝佳示例。

你可以扔它,并把你的网络在该任务的doBackground中的呼叫。

希望你明白了。