2012-06-05 3 views
0

Я реализую класс, который extends AsyncTask, и я выполняю HTTP-запрос в этом классе. Класс не является Activity и находится в отдельном java-файле, потому что я хочу использовать этот класс несколько раз.Вызов метода activitiy из класса non-activity в android

Я создаю объект этого класса в своем Activity, чтобы выполнить запрос http в отдельном потоке. Когда поток выполняется, я хочу вызвать метод моего Activity.

Как это реализовать? Мне нужен результат запроса http в моем Activity, но я не могу справиться с этим до сих пор.

Это код для выполнения этой задачи резьбы ...

public class PostRequest extends AsyncTask<String, Void, String> { 
public String result = ""; 

@Override 
protected String doInBackground(String... urls) { 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://bla/index.php?" + urls[0]); 
     // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 

     // convert response to string 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result = sb.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 

@Override 
protected void onPostExecute(String result) { 

} 
} 

И это часть моего Activity кода, который создает класс резьбы ...

public class ListActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list); 


    PostRequest task = new PostRequest(); 
    task.execute(new String[] { "action=getUsers" }); 
    task.onPostExecute(task.result) { 

    } 
} 

public void Display(String result) { 
    try { 
     JSONArray jArray = new JSONArray(result); 
     JSONObject json_data = jArray.getJSONObject(0); 
     String value = json_data.getString("name"); 
     TextView text = (TextView) findViewById(R.id.value); 
     text.setText(value); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
} 

ответ

1

передать ссылку активности в конструктор ......

в

public class PostRequest extends AsyncTask<String, Void, String> { 
public String result = ""; 
private Activity mActivity; 

public PostRequest(Activity activity){ 
      super(); 
     mActivity = activity; 
} 

...... 
+0

Но как мне теперь получить доступ к методу этой деятельности? Я пытался сделать это, как mActivity.Display(); но это не работает ... Спасибо! – Phil123

+1

либо используйте имя вашей деятельности вместо функции Activity в PostRequest только для операции с типом действия типа. –

+0

@DheereshSingh, спасибо, я думал, что приведение типов к активности должно быть достаточно, но вы правы, это должно быть приписывается реальному классу активности. – antongorodezkiy

0

Вам не нужно делать onPostExecute(), так как это вызвано после завершения процесса doInBackground, а затем вы можете использовать ссылку на активность, переданную в конструктор AsyncTask, для запуска любого времени метода в вашем пользовательском интерфейсе.

Просто помните, что метод onPostExecute() работает в потоке пользовательского интерфейса, поэтому здесь, используя этот метод, вы можете попробовать изменить свое представление, если необходимо.

0

См. Этот вопрос ... can-i-put-asynctask-in-a-separate-class-and-have-a-callback и принятый ответ. Если вы хотите повторно использовать AysncTask в качестве автономного класса, то использовать прослушиватель в качестве обратного вызова для всех ваших действий - лучший способ сделать это.

Смежные вопросы