代码之家  ›  专栏  ›  技术社区  ›  Digvijay

okhttp3正在返回超时异常

  •  1
  • Digvijay  · 技术社区  · 7 年前

    我将okhttp3用作网络库,node mongo用作后端服务。有时当我的应用程序启动时,它会显示超时异常,当我关闭应用程序并再次启动时,它会从服务器获取数据。应用程序中没有错误,但我想知道为什么会显示超时异常。

    下面是我在ListView中显示数据的代码。

    main活动.java

    public class Activity2 extends AppCompatActivity {
    
    ListView listView;
    List<Data> places;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
    
        listView  = findViewById(R.id.listView);
        places = new ArrayList<>();
    
        final ProgressDialog prg = new ProgressDialog(Activity2.this);
        prg.setMessage("Loading...");
        prg.show();
    
        Log.d("OnCreate","Oncreate started");
    
        OkHttpClient client = new OkHttpClient();
    
        Request request = new Request.Builder().url("https://tiffino.herokuapp.com/test").build();
    
        client.newCall(request).enqueue(new Callback() {
    
            @Override
            public void onFailure(Call call, final IOException e) {
    
                prg.dismiss();
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),""+e.getMessage(),Toast.LENGTH_SHORT).show();
                    }
                });
            }
    
            @Override
            public void onResponse(Call call, final Response response) throws IOException {
    
                prg.dismiss();
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
    
                        try {
                            JSONArray arr = new JSONArray(response.body().string());
    
                            for(int i = 0;i < arr.length();i++){
    
                                JSONObject obj = arr.getJSONObject(i);
    
                                String str1 = obj.getString("Name");
    
                                Data data = new Data(str1);
    
                                places.add(data);
    
                            }
    
                            PlacesAdapter adapter=  new PlacesAdapter(places,getApplicationContext());
                            listView.setAdapter(adapter);
    
                        } catch (JSONException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
    
        });
    
       }
    } 
    

    placesadapter.java

    public class PlacesAdapter extends ArrayAdapter<Data> {
    
    private List<Data>  places;
    private Context ctx;
    
    public PlacesAdapter( List<Data> places, Context ctx) {
        super(ctx,R.layout.places_row,places);
        this.places = places;
        this.ctx = ctx;
    }
    
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
        LayoutInflater inflater = LayoutInflater.from(ctx);
    
        View listView = inflater.inflate(R.layout.places_row,null,true);
    
        TextView txt = listView.findViewById(R.id.txt);
    
        Data data = places.get(position);
    
        txt.setText(data.getPlace());
    
        return listView;
    
      }
    }
    

    我该怎么解决?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jayanth    7 年前

    如果服务器速度很慢或服务器的默认超时时间很短,则会发生服务器超时。

    在这种情况下,您可以设置如下请求的超时

    client.setConnectTimeout(35, TimeUnit.SECONDS); //change timeout according to your server needs
    client.setReadTimeout(35, TimeUnit.SECONDS);
    client.setWriteTimeout(35, TimeUnit.SECONDS);
    

    如果您使用的是okhttp3,那么您可以使用生成器来完成如下任务。

    client = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();