这是我的班级:
public class LoginTask extends AsyncTask<Void, Void, Void>
{
Context c;
MainActivity main;
String profileid;
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... unused) {
try {
String semail = MainActivity.email.getText().toString();
String spassword = MainActivity.password.getText().toString();
String savedresponse;
String postURL = "http://(My URL)";
HttpPost post = new HttpPost(postURL);
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
post.setHeader("Content-type","application/json");
JSONObject jsonobj = new JSONObject();
jsonobj.put("username", semail);
jsonobj.put("password", spassword);
StringEntity se = new StringEntity(jsonobj.toString());
post.setEntity(se);
HttpResponse responsePOST = client.execute(post);
HttpEntity resEntity = responsePOST.getEntity();
savedresponse = EntityUtils.toString(resEntity);
if (resEntity != null)
{
Log.i("RESPONSE",savedresponse);
JSONObject json = new JSONObject(savedresponse);
int responseCode;
responseCode = json.getInt("ResponseCode");
profileid = json.getString("ProfileID");
SharedPreferences prefs = main.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.clear();
editor.putString("ProfileCookie", profileid);
editor.commit();
if(responseCode == 100) {
MainActivity.email.setText("");
MainActivity.password.setText("");
main.Login();
}
else
{
Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show();
}
}
if (resEntity == null)
{
Log.i("NO RESPONSE",EntityUtils.toString(resEntity));
Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show();
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
}
}
这是我在错误日志中得到的:
10-04 02:30:07.283: W/System.err(1015): java.lang.NullPointerException
10-04 02:30:07.283: W/System.err(1015): at com.example.testproject.LoginTask.doInBackground(LoginTask.java:88)
10-04 02:30:07.283: W/System.err(1015): at com.example.testproject.LoginTask.doInBackground(LoginTask.java:1)
10-04 02:30:07.283: W/System.err(1015): at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-04 02:30:07.283: W/System.err(1015): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-04 02:30:07.283: W/System.err(1015): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-04 02:30:07.283: W/System.err(1015): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-04 02:30:07.294: W/System.err(1015): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-04 02:30:07.294: W/System.err(1015): at java.lang.Thread.run(Thread.java:841)
当我调试时发现应用程序在共享首选项行崩溃时崩溃,我在最近两天被困在这里并且无法找到任何解决方案
请帮我纠正我的代码。 如果可能,请发布更正后的代码。
答案 0 :(得分:1)
使用:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
代替SharedPreferences prefs = main.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);
答案 1 :(得分:0)
您正在doInBackground方法中执行UI操作,请记住doInBackground方法仅用于后台操作。如果要与UI交互,则使用onPostExecute方法
删除
MainActivity.email.setText("");
MainActivity.password.setText("");
& Toast Messages
从doinBackground 并添加onPostExecute
方法
你的
onPostExecute(){
if(responseCode == 100) {
MainActivity.email.setText("");
MainActivity.password.setText("");
main.Login();
}
else
{
Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show();
}
}
if (resEntity == null)
{
Log.i("NO RESPONSE",EntityUtils.toString(resEntity));
Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show();
}
答案 2 :(得分:0)
你有这个
MainActivity main;
但你在哪里初步main
?假设它是一个活动类,即使你初始化它的错误。
您可以从活动类中的sharepreferences获取值,并将param传递给asynctask doInbackground
。您还可以在活动类中获取editext值,并将其传递给asynctask doInbackground
您无法从doInbackground
MainActivity.email.setText("");
MainActivity.password.setText("");
Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show();
答案 3 :(得分:0)
您无法在doInBackground
方法中执行与UI相关的工作。移动onCreate()
方法
String semail = MainActivity.email.getText().toString(); String spassword = MainActivity.password.getText().toString();
在doInBackground
返回您的请求代码,并在onPostExecute()
方法中写下以下代码。
@Override protected void onPostExecute(Void result) { f(result== 100) { MainActivity.email.setText(""); MainActivity.password.setText(""); main.Login(); } else { Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show(); } }
您还没有在代码中初始化MainActivity
,而是直接引用它。您应该使用当前活动的上下文,即SharedPreferences prefs = c.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);
将您的上下文定义为Context c="youractivityname.this";
答案 4 :(得分:0)
您可以在后台获取SharedPreference实例。问题是您的“主”实例尚未初始化。
SharedPreferences sharedPrefs = getApplicationContext().getSharedPreferences("ProfileName", Context.MODE_PRIVATE);
答案 5 :(得分:0)
只应在doInBackground()方法中处理后台进程。您应该在onPostExecute()方法中放置稍后的代码。