2014-04-01 64 views
0

我正在學習android。我開始使用android進行網絡連接。我面臨的問題是,在try語句下,httpclient.execute(request)行不起作用。相反,catch子句每次都執行。我搜查了很長時間,但我沒有得到有關問題的答案。我很樂意從你方獲得任何幫助。httpclient無法執行httpget對象

這裏是主要的活動

package com.example.androidaspect; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Context context = getApplicationContext(); 
     String url = "http://www.google.com"; 
     TextView tv = (TextView) findViewById(R.id.tvres); 

     AsyncTaskRunner runner = new AsyncTaskRunner(); 
     runner.execute(url, context, tv); 

    } 

} 

這裏是Asynctaskrunner

package com.example.androidaspect; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.content.Context; 
import android.os.AsyncTask; 
import android.widget.TextView; 
import android.widget.Toast; 

public class AsyncTaskRunner extends AsyncTask<String, String, String>{ 

    Context context; 
    TextView tv; 
    String url; 
    String result=""; 

    public void execute(String url, Context context, TextView tv) { 
     // TODO Auto-generated method stub 
     this.tv= tv; 
     this.context = context; 
     this.url = url; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     try{ 
      publishProgress("Loading"); 
      HttpClient hc = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(url); 
      HttpResponse res = hc.execute(request); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(res.getEntity().getContent())); 
      String line=""; 
      while((line=rd.readLine())!=null){ 
       result.concat(line); 
      } 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     tv.setText(result); 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     Toast.makeText(context, values[0], Toast.LENGTH_SHORT).show(); 
    } 

} 

我已經加入了互聯網的權限。我有我的XML這是從網站得到的響應textview。但是當我在模擬器上運行應用程序時,它會運行,但textview不會加載數據。

+0

bcoz你在主界面上運行的網絡操作應該崩潰thrad – Raghunandan

+0

它運行良好。我在網上看到了代碼。他們也在主要用戶界面上做了它。 – Tyagi

+0

這是錯的,你不應該這樣做。它會崩潰發佈蜂窩 – Raghunandan

回答

2

正如我在評論使用的AsyncTask提及。

引用文檔

當應用程序試圖在其主線程執行 網絡操作時引發的異常。

這僅適用於針對Honeycomb SDK或 的應用程序。針對早期SDK版本的應用程序被允許做自己的主事件循環線程 網絡,但它是沉重 氣餒

http://developer.android.com/reference/android/os/AsyncTask.html

public class MainActivity extends Activity { 

    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tvres); 
     tv = (TextView) findViewById(R.id.textView1); 
     new TheTask().execute(); 

    } 
    class TheTask extends AsyncTask<Void,Void,String> 
    { 

     @Override 
     protected String doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 
      String response=null; 
      try { 

        HttpClient hc = new DefaultHttpClient(); 
        HttpGet hg = new HttpGet("http://www.google.com"); 
        HttpResponse res = hc.execute(hg); 
        HttpEntity entity = res.getEntity(); 
        response = EntityUtils.toString(entity); 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      tv.setText(result); 
     } 

    } 

你的AsyncTask作爲一個內部類。

class TheTask extends AsyncTask<Void,Void,String> 

你不會傳遞任何東西給doInbackground。所以第一個參數類型是Void。第二個參數也是空值,因爲你沒有進度指示器。第三種是背景計算結果的類型。所以它的字符串,因爲我們有return response;這是字符串。

現在doInbackground調用在後臺線程。所以在那裏做你的背景計算。

onPostExecute調用UI線程。所以在那裏更新ui。

編輯:

你的方式

public class MainActivity extends Activity { 

    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     String url = "http://www.google.com"; 
     tv = (TextView) findViewById(R.id.tvres); 
     AsyncTaskRunner runner = new AsyncTaskRunner(url,this,tv); 
     runner.execute(); 


    } 
    } 

然後

public class AsyncTaskRunner extends AsyncTask<Void, String, String>{ 

    Context context; 
    TextView tv; 
    String url; 
    String result=""; 

    public AsyncTaskRunner(String url, Context context, TextView tv) { 
     // TODO Auto-generated method stub 
     this.tv= tv; 
     this.context = context; 
     this.url = url; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     // TODO Auto-generated method stub 

      publishProgress("Loading"); 
      String response=null; 
      try { 

        HttpClient hc = new DefaultHttpClient(); 
        HttpGet hg = new HttpGet(url); 
        HttpResponse res = hc.execute(hg); 
        HttpEntity entity = res.getEntity(); 
        response = EntityUtils.toString(entity); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
      return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     tv.setText(result); 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     Toast.makeText(context, values[0], Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

這個工作的感謝..你可以告訴我什麼是我的代碼中的概率。我也使用了asynctask,但在不同的課堂上。 – Tyagi

+0

@Tyagi你有一個方法在你的'Asynctask'中執行。等待我將發佈更新 – Raghunandan

+0

@Tyagi檢查編輯。 – Raghunandan

0

您需要使用的AsyncTask <>或IntentService處理HttpQueries