2017-09-15 24 views
-4

私はアンドロイドでapi呼び出しを行う方法を学習していました。これは私の断片です。このjsonファイルをmyjson.comにアップロードしました。私の断片クラスから、私はAPIをヒットしようとしました。私は応答がjsonオブジェクト内のデータをログに返さなければならないと思います。API呼び出しのandroid.os.NetworkOnMainThreadException

public class TableFragment extends android.support.v4.app.Fragment { 

public TableFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_table, container, false); 

    Button api_btn = (Button)rootView.findViewById(R.id.enter_button); 
    api_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       URL url = new URL("https://api.myjson.com/bins/n80yl"); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       try { 
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder stringBuilder = new StringBuilder(); 
        String line; 
        while ((line = bufferedReader.readLine()) != null) { 
         stringBuilder.append(line).append("\n"); 
        } 
        bufferedReader.close(); 
        Log.d("tagg", "onClick: "+stringBuilder); 
       }catch (Exception e) 
       { 
        Log.d("tagg", "onClick:exception1 "+e); 
       } 
       finally{ 
        urlConnection.disconnect(); 
       } 
      } 
      catch(Exception e) { 
       Log.d("tagg", "doInBackground:exception2 "+e); 

      } 
     } 
    }); 


    return rootView; 
} 

} 

私はマニフェストでインターネット許可を与えました。

これは正しい方法なので、私はアンドロイドでapiの仕組みを学ぶことができます。 ありがとうございます

+1

にインターネットのアクセス許可を追加することを忘れないでください。この質問はAndroidの基本です。ここをクリックしてくださいhttps://stackoverflow.com/questions/6343166/how-do-i-fix-android-os-networkonmainthreadexception –

答えて

0

アプリケーションがメインスレッドでネットワーク操作を実行しようとするとスローされる例外です。 ref

だから、あなたは、バックグラウンド・プロセス(スレッド)に移動する移動する必要があります。

最良の方法は、AsyncTaskは、UIスレッドの適切かつ容易に使用できるようになりますAsyncTask

用いることであろう。このクラスを使用すると、スレッドやハンドラを操作することなく、バックグラウンド操作を実行し、UIスレッドで結果を公開できます。

このコードをAsyncTaskに移動すると機能するはずです。

URL url = new URL("https://api.myjson.com/bins/n80yl"); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       try { 
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder stringBuilder = new StringBuilder(); 
        String line; 
        while ((line = bufferedReader.readLine()) != null) { 
         stringBuilder.append(line).append("\n"); 
        } 
        bufferedReader.close(); 
        Log.d("tagg", "onClick: "+stringBuilder); 
       }catch (Exception e) 
       { 
        Log.d("tagg", "onClick:exception1 "+e); 
       } 
       finally{ 
        urlConnection.disconnect(); 
       } 
      } 
      catch(Exception e) { 
       Log.d("tagg", "doInBackground:exception2 "+e); 

      } 

は、それがS.O.内のいくつかの検索を実行するだけで十分ですあなたのManifest.xmlファイル

<uses-permission android:name="android.permission.INTERNET" /> 
+0

私はクリックして私はそれをしましたpublic void onClick(View v){ getContext( ).startService(新しいインテント(getContext()、RetrieveFeedTask .class)); } –

+0

RetrieveFeedTaskクラスにインテントを渡す方法 –

+0

次に、質問とコードを更新します。 –

関連する問題