2017-01-25 9 views
0

Когда фоновая задача возвращает значение, как можно получить доступ из другого класса. Просто используя это как пример кода, но я хочу, чтобы фоновая задача что-то сделать и вернуть значение.Фоновая задача Android - как получить возвращаемое значение

protected String doInBackground(String... params) { 
    publishProgress("Sleeping..."); // Calls onProgressUpdate() 
    try { 
     // Do your long operations here and return the result 
     int time = Integer.parseInt(params[0]);  

     // Sleeping for given time period 
     Thread.sleep(time); 
     resp = "Slept for " + time + " milliseconds"; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     resp = e.getMessage(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     resp = e.getMessage(); 
    } 

    **return resp;** 
} 
+0

Вы можете использовать AsyncTask для этой цели –

+0

интерфейса для обратных вызовов –

+0

вы получите лучшее понимание здесь: http://stackoverflow.com/questions/9458258/return -a-value-from-asynctask-in-android –

ответ

1

Для этого нужно расширить класс asynktask как

extends AsyncTask<String, String, String> 

@Override 
protected void onPostExecute(String result) { 
    //heare result is value you return from doInBackground() method 
    //this is work on UI thread 
} 

Classs выглядеть

public class AsyncTaskGetResult extends AsyncTask<String, String, String> { 

    PrintListner mPrintListner ;  
    private AsyncTaskGetResult (PrintListner mPrintListner) { 
     this.mPrintListner = mPrintListner; 

    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 
    @Override 
    protected String doInBackground(String... params) { 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    //heare result is value you return from doInBackground() method 
    //this is work on UI thread 
    this.mPrintListner.getResult(result); 
    } 

}

public interface PrintListner { 
    public void getResult(String receiptItem); 
} 

Если вам необходимо получить доступ к нему в другом классе вы можете написать listner для этого и осуществлять в вас деятельность

public class MyActivity extends Activity implements PrintListner{ 

     @Override 
     public void getResult(String receiptItem){ 
     //Do whatever you want 
     } 
    } 

и назвать его как new AsyncTaskGetResult(this).execute(yourString);

+0

'private class nameof extends' ??? Пожалуйста, сделайте это 'public', а затем покажите, как реализовать интерфейс или обратный вызов. Это не очень помогает. Покажите, как вы можете реализовать своего слушателя. – greenapps

+0

в соответствии с вашими потребностями вы можете изменить это –

+0

Ну, я надеюсь, что ОП ценит ваши усилия ;-). – greenapps

0

AsyncTask:

public class YourBackgroundTask extends AsyncTask<String, Void, String> { 
    private Callback callback; 

    public YourBackgroundTask(Callback callback){ 
      this.callback = callback; 
    } 

    protected void doInBackground(String... strings) { 
     // do what you have to do 
     return result; 
    } 

    protected void onPostExecute(String result) { 
      this.callback.onDone(result); 
    } 

    public Interface Callback{ 
      void onDone(String result); 
    } 
} 

и назвать его так:

new YourBackgroundTask(yourCallback).execute(yourString); 
0

У вас есть немного недоразумение , Фоновые задачи НЕ возвращают значение. Они просто что-то делают. Если вы хотите получить значение из некоторых вычислений, выполненных в фоновом режиме, вы можете сделать фоновое задание так, чтобы при завершении оно уведомляло некоторый объект о результирующем значении.

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

Ваш интерфейс слушатель может выглядеть следующим образом:

interface ValueListener { 
    public void onValueComputed(int computedValue); 
} 

Тогда класс реализации выглядит следующим образом:

class ValueListenerImpl implements MyListener { 
    @Override 
    public void onValueComputed(int computedValue) { 
     //do something... 
    } 
} 

(или вы можете сделать анонимный класс)

Ваша фоновая задача :

class MyAsyncTask extends AsyncTask<Void, Void, Integer> { 
    ValueListener listener; 

    public MyAsyncTask(ValueListener valueListener) { 
     this.listener = valueListener; 
    } 

    @Override 
    public Integer doInBackground(Void.. params) { 
     //do something... 
     return someValue; 
    } 

    @Override 
    public onPostExecute(Integer.. values) { 
     listener.onValueComputed(values[0]); 
    } 
} 

Наконец, в основном потоке вы делаете:

... 
    this.valueListener = new ValueListenerImpl(); 
    new MyAsyncTask(this.valueListener).execute(); 
    ... 
+0

valueListener.onValueComputed (значения [0]); = значениеListener не может быть разрешено. –

+0

Исправлено имя переменной – Gonzalo