正如标题所示,我有一个沉重的过程,比如从Web服务获取数据,为listview设置适配器,以及更多如初始化按钮和图像。如何在运行时运行AsyncTask开始
所以我创建的AsyncTask将运行我的HttpGet
方法,然后设置列表视图适配器。
但是当我调用的OnCreate的AsyncTask
我获得以下错误
can't create handler inside thread that has not called looper.prepare()
我怎么能运行Asynctask
当活动开始,但不要把代码oncreate
?
我的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
progressBar = (ProgressBar)findViewById(R.id.prgLoading);
URLService = getString(R.string.URLService);
Enc_Pass = getString(R.string.password_encryption);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
SharedPreferences pref = getSharedPreferences("MyPref", MODE_PRIVATE);
strUserId = pref.getString("userId", null);
strPassword = pref.getString("Password", null);
code_comp = pref.getString("CompanyCode",null);
lv = (ListView)findViewById(R.id.lvProfile);
new LoadDataForActivity().execute();
imageToUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
}
});
}
private class LoadDataForActivity extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
getAll();
getTotalLeaveBalance();
getMedicalBalance();
return null;
}
@Override
protected void onPostExecute(Void result) {
progressBar.setVisibility(View.GONE);
}
}
private void getAll()
{
try {
String Status = "";
String valueEncrypt = strUserId + "|" + strPassword;
String encc = "";
try {
encc = ANGGACRYYPT.encrypt(Enc_Pass,valueEncrypt);
encc = encc.replace("+", "%2B");
}catch (GeneralSecurityException e){
//handle error
}
RESTClient client = new RESTClient(URLService+"do?method=dologin&value=" +encc);
client.Execute(RESTClient.RequestMethod.GET);
String response = client.getResponse();
response = response.replace("\\\"", "\"");
response = response.substring(1, response.length() - 1);
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
Status = jsonObject.get("Status").toString();
if (Status == "true") {
String dataku = jsonObject.get("Data").toString();
try {
dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
}catch (GeneralSecurityException e){
//handle error - could be due to incorrect password or tampered encryptedMsg
}
JSONParser parser = new JSONParser();
JSONObject structure = (JSONObject) parser.parse(dataku);
etFullName = (EditText) findViewById(R.id.etFullname);
etEmail = (EditText) findViewById(R.id.etEmail);
etPhone = (EditText) findViewById(R.id.etPhone);
etAddress = (EditText) findViewById(R.id.etAddress);
etDirectSuperiorName = (EditText) findViewById(R.id.etDirectSuperiorName);
etSisaCuti = (EditText)findViewById(R.id.etSisaCuti);
etFullName.setText(structure.get("Fullname") == null ? "" : structure.get("Fullname").toString());
etEmail.setText(structure.get("Email") == null ? "" : structure.get("Email").toString());
etPhone.setText(structure.get("Phone") == null ? "" : structure.get("Phone").toString());
etAddress.setText(structure.get("Address") == null ? "" : structure.get("Address").toString());
etDirectSuperiorName.setText(structure.get("DirectSuperiorName") == null ? "" : structure.get("DirectSuperiorName").toString());
// etSisaCuti.setText(structure.get("LeaveBalance") == null ? "" : structure.get("LeaveBalance").toString());
strPhoto = structure.get("strPhoto") == null ? "" : structure.get("strPhoto").toString();
imageToUpload = (ImageView)findViewById(R.id.imageToUpload);
byte[] decodedString = Base64.decode(strPhoto, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
//show the image
imageToUpload.setImageBitmap(decodedByte);
lv.setAdapter(new ListProfileAdapter(this,mItems));
} else {
Toast.makeText(getApplicationContext(), "Get Data Failed!",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void getMedicalBalance(){
try{
String valueEncrypt = strUserId + "|" + code_comp;
String encc = "";
try {
encc = ANGGACRYYPT.encrypt(Enc_Pass,valueEncrypt);
encc = encc.replace("+", "%2B");
}catch (GeneralSecurityException e){
//handle error
}
/* RESTClient client = new RESTClient(URLService+"get?method=getmedicalapprovallist&value="
+ userId + URLEncoder.encode("|", "UTF-8") + rowsPerPage);*/
RESTClient client = new RESTClient(URLService+"get?method=getkuotaclaimbyemployeename&value="
+ encc);
client.Execute(RESTClient.RequestMethod.GET);
String response = client.getResponse();
response = response.replace("\\\"", "\"");
response = response.substring(1, response.length() - 1);
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
mItems = new ArrayList<ListProfileItem>();
String Status = jsonObject.get("Status").toString();
if (Status == "true") {
// JSONArray structure = (JSONArray) jsonObject.get("DataList");
String dataku = jsonObject.get("DataList").toString();
try {
dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
}catch (GeneralSecurityException e){
//handle error - could be due to incorrect password or tampered encryptedMsg
}
JSONParser parser = new JSONParser();
JSONArray structure = (JSONArray) parser.parse(dataku);
for (int i = 0; i < structure.size(); i++) {
JSONObject data = (JSONObject) structure.get(i);
item = new ListProfileItem();
item.claimpostname = data.get("claim_post_name").toString();
String claimamount = data.get("max_limit_per_year").toString();
if (claimamount!=("0.0"))
{
Double amount = Double.parseDouble(claimamount);
DecimalFormat formatter = new DecimalFormat("#,###.00");
String AmountFormatted = formatter.format(amount);
item.claimpostamount = AmountFormatted;
}
else
{
item.claimpostamount = data.get("max_limit_per_year").toString();
}
mItems.add(item);
}
// initialize and set the list adapter
}
}
catch(Exception e){
e.printStackTrace();
}
}
private void getTotalLeaveBalance()
{
try {
String valueEncrypt = code_comp + "|" + strUserId;
String encc = "";
try {
encc = ANGGACRYYPT.encrypt(Enc_Pass,valueEncrypt);
encc = encc.replace("+", "%2B");
}catch (GeneralSecurityException e){
//handle error
}
RESTClient client = new RESTClient(URLService+"get?method=gettotalleavebalance&value=" +encc);
client.Execute(RESTClient.RequestMethod.GET);
String response = client.getResponse();
response = response.replace("\\\"", "\"");
response = response.substring(1, response.length() - 1);
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
String Status = jsonObject.get("Status").toString();
if (Status == "true") {
String dataku = jsonObject.get("Data").toString();
try {
dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
}catch (GeneralSecurityException e){
//handle error - could be due to incorrect password or tampered encryptedMsg
}
JSONParser parser = new JSONParser();
JSONObject structure = (JSONObject) parser.parse(dataku);
etSisaCuti.setText(structure.get("total_leave_balance") == null ? "" : structure.get("total_leave_balance").toString());
} else {
Toast.makeText(getApplicationContext(), "Get Data Failed!",
Toast.LENGTH_SHORT).show();
}
}catch (Exception e)
{
e.printStackTrace();
}
}
注意,在我的get()方法存在是可以根据连接一个缓慢的过程HTTPGET,所以我需要这一切get方法在里面的AsyncTask因此他们我不会让这个过程缓慢
和我应该在DoInBackground()返回?
---修订版----
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
progressBar = (ProgressBar)findViewById(R.id.prgLoading);
URLService = getString(R.string.URLService);
Enc_Pass = getString(R.string.password_encryption);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
SharedPreferences pref = getSharedPreferences("MyPref", MODE_PRIVATE);
strUserId = pref.getString("userId", null);
strPassword = pref.getString("Password", null);
code_comp = pref.getString("CompanyCode",null);
etFullName = (EditText) findViewById(R.id.etFullname);
etEmail = (EditText) findViewById(R.id.etEmail);
etPhone = (EditText) findViewById(R.id.etPhone);
etAddress = (EditText) findViewById(R.id.etAddress);
etDirectSuperiorName = (EditText) findViewById(R.id.etDirectSuperiorName);
etSisaCuti = (EditText)findViewById(R.id.etSisaCuti);
imageToUpload = (ImageView)findViewById(R.id.imageToUpload);
lv = (ListView)findViewById(R.id.lvProfile);
new LoadDataForActivity().execute();
imageToUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
}
});
}
private class LoadDataForActivity extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
progressBar.setVisibility(View.VISIBLE);
progressBar.setIndeterminate(false);
progressBar.setClickable(false);
}
@Override
protected Void doInBackground(Void... params) {
getAll();
getTotalLeaveBalance();
getMedicalBalance();
return null;
}
@Override
protected void onPostExecute(Void result) {
progressBar.setVisibility(View.GONE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
}
private void getAll()
{
try {
String Status = "";
String valueEncrypt = strUserId + "|" + strPassword;
String encc = "";
try {
encc = ANGGACRYYPT.encrypt(Enc_Pass,valueEncrypt);
encc = encc.replace("+", "%2B");
}catch (GeneralSecurityException e){
//handle error
}
RESTClient client = new RESTClient(URLService+"do?method=dologin&value=" +encc);
client.Execute(RESTClient.RequestMethod.GET);
String response = client.getResponse();
response = response.replace("\\\"", "\"");
response = response.substring(1, response.length() - 1);
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
Status = jsonObject.get("Status").toString();
if (Status == "true") {
String dataku = jsonObject.get("Data").toString();
try {
dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
}catch (GeneralSecurityException e){
//handle error - could be due to incorrect password or tampered encryptedMsg
}
JSONParser parser = new JSONParser();
JSONObject structure = (JSONObject) parser.parse(dataku);
etFullName.setText(structure.get("Fullname") == null ? "" : structure.get("Fullname").toString());
etEmail.setText(structure.get("Email") == null ? "" : structure.get("Email").toString());
etPhone.setText(structure.get("Phone") == null ? "" : structure.get("Phone").toString());
etAddress.setText(structure.get("Address") == null ? "" : structure.get("Address").toString());
etDirectSuperiorName.setText(structure.get("DirectSuperiorName") == null ? "" : structure.get("DirectSuperiorName").toString());
// etSisaCuti.setText(structure.get("LeaveBalance") == null ? "" : structure.get("LeaveBalance").toString());
strPhoto = structure.get("strPhoto") == null ? "" : structure.get("strPhoto").toString();
byte[] decodedString = Base64.decode(strPhoto, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
//show the image
imageToUpload.setImageBitmap(decodedByte);
lv.setAdapter(new ListProfileAdapter(this,mItems));
} else {
Toast.makeText(getApplicationContext(), "Get Data Failed!",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
请包括getAll(); getTotalLeaveBalance(); getMedicalBalance(); – Nizam
我更新了我的代码,请检查 – gilllsss
更新UI元素不能在后台线程内完成。即,你不能在'doInBackground()'内部写'EditText.setText()'。 UI更新应该在'AsyncTask <>''的'onPostExecute()'内完成。 – Nizam