2015-07-01 5 views
-1

так вот мой код, и я пробовал getContent на базовой java, и он отлично работает. но здесь это совсем не так. содержимое URL-адреса всегда пусто. Я также добавил разрешение.INTERNET в манифест. Я новичок в андроидandroid url всегда возвращает пустую строку

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    String lines=""; 
    try { 
     lines=getContent("http://detik.com"); 
    }catch (Exception e) {e.printStackTrace();} 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage(lines); 

    alertDialogBuilder.setPositiveButton("yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface arg0, int arg1) { 
      Toast.makeText(MainActivity.this, "You clicked yes button", Toast.LENGTH_LONG).show(); 
     } 
    }); 

    alertDialogBuilder.setNegativeButton("No",new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      finish(); 
     } 
    }); 

    AlertDialog alertDialog = alertDialogBuilder.create(); 
    alertDialog.show(); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public static String getContent(String url) { 
    String pageContent=""; 
    try 
    { 
     URL pageLink=new URL(url); 
     BufferedReader in=new BufferedReader(new InputStreamReader(pageLink.openStream())); 

     String line=in.readLine(); 
     while (line!=null) 
     { 
      pageContent=pageContent+line; 
      line=in.readLine(); 
     } 
     in.close(); 
    } catch (Exception e) {e.printStackTrace();} 
    return "content of "+url+" : "+pageContent; 
} 

и это мой манифест

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.test.myuser.testtabview" > 
<uses-permission android:name="android.permission.INTERNET"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 
</manifest> 
+0

u не может напрямую загрузить URL-адрес в главной теме Активность андроида –

ответ

1

Пожалуйста, попробуйте функцию ниже:

public void getContent(String url) { 

     new AsyncTask<Void, Void, String>() { 

      @Override 
      protected String doInBackground(Void... voids) { 

       HttpURLConnection conn = null; 

       try { 
        conn = (HttpURLConnection) new URL(url).openConnection(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       if (conn != null) { 
        conn.setRequestProperty("Accept", "application/json,text/html"); 
        conn.setRequestProperty("Content-Type", "application/json"); 
        conn.setRequestProperty("Cookie", ""); 

        try { 
         InputStream is = conn.getInputStream(); 
         BufferedReader br = new BufferedReader(new InputStreamReader(is, 
           "UTF-8")); 
         StringBuffer sb = new StringBuffer(); 
         String line; 
         while ((line = br.readLine()) != null) { 
          sb.append(line).append("\n"); 
         } 
         br.close(); 
         is.close(); 
         conn.disconnect(); 
         return sb.toString(); 

        } catch (SocketException e) {// connection reset 
         Log.d(TAG, "SocketException: " + e); 
         return null; 
        } catch (Exception e) {// connection reset 
         Log.d(TAG, "Exception: " + e); 
         return null; 
        } 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 

       // You get the result here 

      } 
     }.execute(null, null, null); 
    } 

Http соединение считается трудоемким действие, поэтому вам нужно поместить его в другой поток вместо потока пользовательского интерфейса, поэтому в образце, который я использовал AsyncTask, результат будет в функции onPostExcecute.

+0

это работает. Спасибо за помощь – user3725273

0

Вы не можете сделать «интернет-работа» в главном потоке, вы должны использовать AsyncTask как этот пример.

private class AsyncTaskDownloadSomething extends 
     AsyncTask<String[], String, String> { 

    DataClassLentABook mData; 





    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //Do some prepartations over here, before the task starts to execute 
     //Like freeze the button and/or show a progress bar 


    } 





    @Override 
    protected String doInBackground(String... urls) { 
     // Task starts executing. 
     String url = urls[0]; 

     // Execute HTTP requests here, with one url(urls[0]), 
     // or many urls using the urls table 
     // Save result in myresult 

     return myresult; 

    } 





    protected void onPostExecute(String result) { 
       //Do modifications you want after everything is finished 
       //Like re-enable the button, and/or hide a progressbar 
       //And of course do what you want with your result got from http-req 



    } 
} 

Чтобы выполнить свою задачу асинхронной, когда ваша кнопка нажата, просто написать следующее:

new AsyncTaskDownloadSomething().execute(someURL); 
+0

большое спасибо за помощь – user3725273

+0

вы можете проголосовать за мой ответ. :) – gmetax

+0

Я пытался, но сказал, что мне нужно как минимум 15 репутации, я вернусь, чтобы проголосовать за ваш ответ, как только я достиг достаточной репутации. – user3725273