2016-09-09 3 views
0

"새로 고침"버튼이 호출 될 때 아래 URL로 API 호출을 시도하고 JSON을 구문 분석하려고합니다.Android Calling API 및 JSON 구문 분석

버튼에 연결하여 텍스트 (Hello World)를 화면에 표시 할 수 있지만 버튼 클릭을 API 요청에 연결할 수는 없습니다. 오류 메시지는 내가 아닌 정적 메서드는 정적 컨텍스트

public class MainActivity extends AppCompatActivity { 



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

public void retrieveInformation(View view){ 
    RetrieveFeedTask.execute(); 
    TextView textview = (TextView) findViewById(R.id.responseView); 
    textview.setText("Hello world"); 
} 

class RetrieveFeedTask extends AsyncTask<Void, Void, String> { 
    String jsonString = ""; 

    private Exception exception; 

    protected void onPreExecute() { 

    } 

    protected String doInBackground(Void... urls) { 

     // Do some validation here 

     try { 
      URL url = new URL("www.liftin.co.uk/api/v1/journeys"); 
      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(); 
       return stringBuilder.toString(); 
      } finally { 
       urlConnection.disconnect(); 
      } 
     } catch (Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    protected void onPostExecute(String response) { 
     if (response == null) { 
      response = "THERE WAS AN ERROR"; 
     } 
     Log.i("INFO", response); 
     jsonString = response; 
     try { 
      getInformationFromJson(jsonString); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    private String getInformationFromJson(String jsonString) 
     throws JSONException { 
     final String DRIVER = "driver"; 
     final String START = "start"; 
     final String DESTINATION = "destination"; 
     final String TIME = "pick_up_time"; 
     final String PASSENGERS = "passengers"; 
     final String SEATS = "seats_available"; 

     JSONObject journeyJson = new JSONObject(jsonString); 
     String time = journeyJson.getString(TIME); 
     String seats = journeyJson.getString(SEATS); 

     String results = seats + "-----" + time; 
     return results; 
    } 


} 

}

Main_activity.xml에서 "실행"을 참조 할 수 없습니다 말했다

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="com.example.android.liftin.MainActivity"> 
    <Button 
     android:id="@+id/queryButton" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="end" 
     style="@style/Base.Widget.AppCompat.Button.Borderless" 
     android:text="Refresh" 
     android:onClick="retrieveInformation"/> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center"> 
     <ScrollView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
      <TextView 
       android:id="@+id/responseView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
     </ScrollView> 
    </RelativeLayout> 
</LinearLayout> 
+0

당신은 링크를 작성했지만'setOnClickListener'와'retrieveInformation'의 호출을 볼 수 없습니다. – Joshua

+0

main_activity.xml – lbreen

+0

@ Joshua의 버튼 클릭으로 트리거됩니다. 그는 'button' 위젯의'XML' 파일에서이 작업을 수행했습니다. 'android : onClick = "retrieveInformation"' –

답변

0
당신이처럼 AsyncTask를위한 비동기 호출을 작성해야

:

public void retrieveInformation(View view){ 
    new RetrieveFeedTask().execute(); //asynchronous call 
    TextView textview = (TextView) findViewById(R.id.responseView); 
    textview.setText("Hello world"); 
} 

UPDATE

데이터를 구문 분석 한 후 데이터를 텍스트보기로 설정하려는 경우. 다음과 같이 활동을 조금 변경해야합니다.

  1. 당신은 당신의 textview에서 onCreate()에서 초기화 및 전체 활동에 액세스 할 수 있도록, 활동을 위해 전역 변수를 확인해야합니다.

  2. 은 다음 onPostExecute() 이렇게에서 :

    textview.setText(getInformationFromJson(response));

은 당신이 그것을 호출하기 전에 AsyncTask를 (RetrieveFeedTask)의 객체를 만들어야합니다 :)

+0

건배. 그것은 "기호 실행을 해결할 수 없다"고 말하는 것입니까? – lbreen

+0

클래스 이름 뒤에 bracks "()"를 삽입하십시오. 이'RetrieveFeedTask()'와 마찬가지로 –

+0

건배 - 작동 했나요? 정보가 로그에 표시되지만 화면에 표시되지 않습니까? – lbreen

0

을 도움이되기를 바랍니다. 예를

public void retrieveInformation(View view){ 
     TextView textview = (TextView) findViewById(R.id.responseView); 
     textview.setText("Hello world"); 
     new RetrieveFeedTask().execute(); 
    } 
0

를 들어 당신은 여전히 ​​Void 위해 뭔가를 전달해야합니다.

public void retrieveInformation(View view){ 
    new RetrieveFeedTask().execute(null); 
    TextView textview = (TextView) findViewById(R.id.responseView); 
    textview.setText("Hello world"); 
}