Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public class GetRequest extends AsyncTask<String, Integer, String> {
private Activity activity;
private Exception e=null;
public GetRequest(Activity _activity) {
this.activity = _activity;
}
@Override
protected String doInBackground(String... params) {
HttpGet getRequest = null;
try {
getRequest = new HttpGet(params[0]);
Log.d("URL","url:"+params[0]);
HttpResponse response = App.getClient().execute(getRequest);
final int statusCode = response.getStatusLine().getStatusCode();
Log.d("STATUS","status:"+Integer.toString(statusCode));
if (statusCode != HttpStatus.SC_OK) {
return "";
}
HttpEntity getResponseEntity = response.getEntity();
String r = EntityUtils.toString(getResponseEntity);
return r;
}
catch (Exception e) {
if (null != getRequest) getRequest.abort();
this.e=e;
return "Error:"+e;
}
}
@Override
public void onPostExecute(String result) {
if (null != e) {
Log.e("GetRequest", "Exception", e);
if (activity!=null) alert(e);
//падает вот тут, проверка на нул не помогает
//если закоментить строчку выше ошибка пропадет, но я теряю возвожность взаимодействия из асинтаска с уи
}
}
private void alert(Throwable t) {
AlertDialog.Builder builder=new AlertDialog.Builder(activity);
builder
.setTitle("Exception!")
.setMessage(t.toString())
.setPositiveButton("OK", null)
.show();
}
}
//запуск задачи
try {
result = new GetRequest(this).execute("http://something").get();
} catch (Exception e) {
e.printStackTrace();
}
private ArrayList<Person> getContactList() {
/*try {
personList = new GetContacts(MActivity.this).execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}*/
if (startDialog == null) {
startDialog = new ProgressDialog(MActivity.this);
startDialog.setCancelable(true);
startDialog.show();
startDialog.setContentView(R.layout.emptydialog);
}
ArrayList<Person> contactList = new ArrayList<Person>();
Cursor cur = null,phones = null;
Person aContact = new Person();
try {
cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.moveToFirst()) {
int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
int displayNameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
do {
String contactId = cur.getString(idColumn);
String disPlayName = cur.getString(displayNameColumn);
//Например сыпется тут с ошибкой java.lang.IllegalStateException: Couldn't init cursor window
int phoneCount = cur.getInt(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if(phoneCount>0){
phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + contactId, null, null);
if(phones.moveToFirst()){
do{
String phoneNumber= phones.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
aContact = new Person();
aContact.setPersonId(contactId);
aContact.setPhoneNum(phoneNumber);
aContact.setName(disPlayName.toLowerCase());
contactList.add(aContact);
//System.out.println(phoneNumber);
}while(phones.moveToNext());
}
}
}while(cur.moveToNext());
}
}
finally {
if (cur != null) cur.close();
if (phones != null) phones.close();
}
if (startDialog!=null) startDialog.dismiss();
return contactList;
}
* This source code was highlighted with Source Code Highlighter.android:configChanges="keyboardHidden|orientation" элемента activity в файле манифеста. В этом случае интерфейс все таки будет переворачиваться, но со стороны контролов все будет выглядеть как будто просто изменились размеры.public class TestActivity extends ListActivity {
/** State held between configuration changes. */
private State state;
private TestTask testTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
state = (State) getLastNonConfigurationInstance();
final boolean previousState = state != null;
if (previousState) {
testTask = state.testTask;
if (testTask != null) {
testTask.setTarget(this);
}
} else {
state = new State();
testTask = new TestTask(this);
state.testTask = testTask;
}
}
@Override
protected void onDestroy() {
if (testTask != null) {
testTask.cancel(true);
}
super.onDestroy();
}
@Override
public Object onRetainNonConfigurationInstance() {
state.testTask = testTask;
return state;
}
private void runTestTask() {
if (testTask != null && testTask.getStatus() == AsyncTask.Status.RUNNING) {
return;
}
if (testTask == null || testTask.getStatus() == AsyncTask.Status.FINISHED) {
testTask = new TestTask(this);
}
testTask.execute();
}
private static class TestTask extends WeakAsyncTask<Void, Void, Void, TestActivity> {
public TestTask(TestActivity target) {
super(target);
}
@Override
protected Void doInBackground(TestActivity target, Void... params) {
return null;
}
@Override
protected void onPostExecute(TestActivity target, Void result) {
super.onPostExecute(target, result);
}
}
private static class State {
TestTask testTask;
}
}
Android UI thread