В 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>