在Android中,如何在主线程中运行后台线程代码并返回值?

时间:2015-12-02 10:43:17

标签: android multithreading android-asynctask thread-safety android-handler

如果从后台线程调用它,我们可以使用handler在主线程上运行一段代码:

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

            });

Q1:那么,如果myMethod()返回一些值,那么我们怎样才能得到它(因为我们无法从run()方法获得任何返回值)?

Q2:有没有办法使用AsyncTask在主线程上运行代码?我们知道在主线程上调用了onPostExecute()。但是我可以在onPostExecute()上执行它之后从asynctask返回任何内容吗?

2 个答案:

答案 0 :(得分:0)

应用此项并告知我们您是否收到了数据?

创建一个应用程序类。

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>

答案 1 :(得分:0)

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

这是为了在ui线程上运行bg任务