В Android, как запустить фоновый поток кода в основном потоке и получить возвращаемое значение?

Мы можем использовать обработчик для запуска фрагмента кода в основном потоке, если он был вызван из фонового потока, например:

 new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                  myMethod(); //this will run on main thread
                } 

            });

Q1: Итак, если myMethod() возвращает какое-то значение, то как мы можем получить это (так как мы не можем получить какое-либо возвращаемое значение из run() метод)?

Q2: есть ли способ запустить код в главном потоке, используя AsyncTask? Мы знаем это onPostExecute() вызывается в основном потоке. Но можем ли мы вернуть что-нибудь из asynctask после его выполнения на onPostExecute()?

2 ответа

Handler handler = new Handler();

    @SuppressLint("NewApi")
    private class getNetData extends AsyncTask<Void, String, Object> {

        protected void onPreExecute() {
            //here u can use the handler to post notification / data to the main ui thread 
            handler.post(new Runnable() {
                public void run() {
                }
            });

        }

        protected Object doInBackground(Void... params) {
            //this runs the back task on main thread
            if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }
        }

        protected void onPostExecute(Object result) {
            //this runs the data aft the back ground task
        }
    }

chk это для запуска задачи bg в потоке пользовательского интерфейса

Примените это и дайте мне знать, если вы получаете свои данные или нет?

Создайте один класс приложения.

MyApplication.java

public class MyApplication extends Application{

    private static Context context;

    public void onCreate(){
        super.onCreate();
//set activity context here , so it can accessible any where 
        MyApplication.context = getApplicationContext(); 
    }    
    public static Context getAppContext() {
        return MyApplication.context;
    }
}

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

MySharedPref pref= new MySharedPref(MyApplication.getAppContext());
pref.saveImei("DATA", ""+data);

и убедитесь, что одна вещь, зарегистрируйте свой класс приложения в манифесте.

<application android:name="com.xyz.MyApplication">    
</application>
Другие вопросы по тегам