我试图通过网络登录用户,使用OkHttp库发送请求并获得响应。在我打开应用程序运行这些并输入电子邮件和密码作为输入并按下登录按钮后,我的应用程序崩溃了。
LoginFragment:
public void onClick(View view) {
String a=ed1.getText().toString();
String b=ed2.getText().toString();
Log.e("sas", "onClick: "+a );
NetworkRequestAndResponse asyncTask = new NetworkRequestAndResponse(getActivity());
asyncTask.execute(a,b);
}
});
return view;
的AsyncTask:
public class NetworkRequestAndResponse extends AsyncTask<String,String,String> {
Context context;
public NetworkRequestAndResponse(Context context){
this.context = context.getApplicationContext();
}
@Override
protected String doInBackground(String... params) {
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody= new FormBody.Builder().add("email",params[0])
.add("password",params[1]).build();
Request request = new Request.Builder().url("http://192.168.1.8:8011/api/check")
.post(requestBody).build();
Log.e("asd", "doInBackground: "+request );
Response response=null;
try {
response = okHttpClient.newCall(request).execute();
return response.body().string();
} catch (RuntimeException|IOException e){
Log.e("455", "doInBackground: ",e );
}
finally {
response.close();
}
return null;
}
@Override
protected void onPostExecute(String obj){
if (obj.equals("true")){
Intent intent = new Intent(context, WelcomeActivity.class);
context.startActivity(intent);
}else{
Toast.makeText(context,"Invalid Email or Password",Toast.LENGTH_SHORT).show();
}
}
}
MainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
LoginFragment obj = new LoginFragment();
fragmentManager.beginTransaction().add(R.id.content,obj).commit();
MessagesFragment messagesFragment = new MessagesFragment();
}
}
答案 0 :(得分:1)
正如异常所说..尝试在空对象引用上调用虚方法。 它可能是由异常引起的,如果发生在try块中..如果try块中发生异常,那么它会在catch块之后直接进入finally块。在那种情况下,当它试图关闭响应时(将是null),发生上述异常。
答案 1 :(得分:0)
可以理解,如果出现错误,您需要确保关闭连接。但问题是,当response = okHttpClient.newCall(request).execute();
的任何部分抛出异常时,分配将不会发生。在这种情况下,当您尝试在finally块中关闭它时,response
将为null。
问题的最大部分在于你在一行代码中做了很多事情。打破这一行,以便在抛出异常之前有更好的机会初始化response
。
答案 2 :(得分:0)
我强烈建议Retrofit库进行网络通话。它为您完成所有异步操作(您不需要使用0.12.6
),它非常易于使用,具有出色的API,并且在Android社区中广泛使用。
同样适用于AsyncTask
。
回到OkHttp
块中发生的代码问题 - 在null对象上调用try catch
。不能说为什么,但行response.close()
可能抛出异常。