2016-10-24 4 views
0

Я хочу сохранить результат из метода OnResponse, чтобы использовать его для обновления UI Я попытался сохранить результат в String var, затем назовите его в основной поток, но он не Работа .Сохранить ответ от OkHttp - Android -

вот мой код с некоторыми комментариями, любая помощь?

package com.example.blacknight.testokhttp; 


import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import java.io.IOException; 
import okhttp3.Call; 
import okhttp3.Callback; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 

import static android.R.string.ok; 
public class MainActivity extends AppCompatActivity { 

    public final String URL_MOVIE = "http://api.themoviedb.org/3/movie/popular?api_key=" + API_KEY; 
    String res_120 ; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    OkHttpClient client = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url(URL_MOVIE) 
      .build(); 

    client.newCall(request).enqueue(new Callback() { 

     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

      Log.v("BK-201 URL: " , response.body().string()); 

      // wanna save the result to update UI 
      res_120 = response.body().string(); 

     } 

    }); 


    // just for test : if the result has been saved or not 
    Log.i("BK-111 : " , res_120); 


} 

}

+2

Имейте в виду, что тха вызов, вы делаете с клиентом асинхронно и что обратный вызов, который реализует вашу функцию onResponse, вызывается только тогда, когда этот асинхронный вызов завершается. Из-за этого журнал в вашем потоке пользовательского интерфейса будет выполнен до обратного вызова, а переменная res_120 будет пустой. Чтобы выполнить OkHttp синхронно, вы должны вызвать execute(), а не enqueue(), но это заблокирует ваш поток пользовательского интерфейса, и вы не должны этого делать. Например, вы могли бы переместить весь код в Asynctask. –

+0

yup, я пытался сделать это, чтобы избежать использования Asynctask и Loaders, поэтому единственный способ выполнить эту задачу - использовать AsyncTask или что-то в этом роде? –

+0

и вообще лучший способ обновить интерфейс с помощью ответа от OkHttp? –

ответ

0

Допустим, вы хотите обновить TextView элемент вы UI с ответом в формате String. Вы могли бы сделать что-то подобное. Я сохранил ваш тестовый журнал, чтобы помочь вам следовать коду, на всякий случай.

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

    OkHttpClient client = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url(URL_MOVIE) 
      .build(); 

    client.newCall(request).enqueue(new Callback() { 

     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

      Log.v("BK-201 URL: " , response.body().string()); 

      // wanna save the result to update UI 
      res_120 = response.body().string(); 
      updateUI(response.body().string()); 
     } 
    });  
} 

void updateUI(String string) { 
    textView.setText(string); 
    Log.i("BK-111 : " , res_120); 
} 
+0

этот код дает мое NullPointerException, но я уловил идею –

+0

Как вы говорите, этот код полезен только для того, чтобы поймать идею. Если вам нужна помощь в более подробной проблеме, просто спросите, и мы постараемся помочь –

+0

yup i will, thanks alot :) –

0

Вот рабочий код для тех, кто имеет такую ​​же проблему, новый или на использовании OkHttp, к сожалению, я использую AsyncTask

Thaks в Jofre Mateu

package com.example.blacknight.testokhttp; 


import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 


public class MainActivity extends AppCompatActivity { 

    public final String URL_MOVIE = "http://api.themoviedb.org/3/movie/popular?api_key=" + API_KEY ; 


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

     new MovieTask().execute(); 
    } 


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

     @Override 
     protected String doInBackground(String... params) { 

      try { 

       OkHttpClient client = new OkHttpClient(); 



       Request request = new Request.Builder() 
         .url(URL_MOVIE) 
         .build(); 


       Response response = client.newCall(request).execute(); 
       String res_120 = response.body().string(); 

       return res_120; 

      } catch (Exception e){ 

       return null; 
      } 
     } 


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

      TextView textView = (TextView) findViewById(R.id.testView_test); 
      textView.setText(s); 
     } 
    } 

}