Java 异步任务完成后如何更改ActionBar的颜色?

Java 异步任务完成后如何更改ActionBar的颜色?,java,android,android-asynctask,Java,Android,Android Asynctask,在我的应用程序中,我正在连接到WebView的onPageFinished中执行AsyncTask。此方法如下所示: @Override public void onPageFinished(WebView myWebView, String url) { new SendRequestAsyncTask().execute(); // when a page has finished loading dismiss any progress dialog if (pr

在我的应用程序中,我正在连接到WebView的
onPageFinished
中执行
AsyncTask
。此方法如下所示:

@Override
public void onPageFinished(WebView myWebView, String url)
{
    new SendRequestAsyncTask().execute();

    // when a page has finished loading dismiss any progress dialog
    if (progressDialog != null && progressDialog.isShowing())
    {
        progressDialog.dismiss();
    }
}
public class SendRequestAsyncTask extends AsyncTask <Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        //runs in ui thread
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("myscript.php");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("request", "12345"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);

            // writing response to log
            HttpEntity resEntity = response.getEntity();

            if (resEntity != null) {

                String responseStr = EntityUtils.toString(resEntity).trim();
                Log.v(TAG, "Response: " +  responseStr);

                String[] parts = responseStr.split(":");
                parts[1] = parts[1].replace("\"", "");
                parts[1] = parts[1].replace("}", "");

                if (parts[1].equals("01")){
                    actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
                } else {
                    Log.v(TAG, "No success: " + parts[1]);
                }

            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //runs in ui thread you can update the layout here
    }
}
SendRequestAsyncTask
看起来是这样的:

@Override
public void onPageFinished(WebView myWebView, String url)
{
    new SendRequestAsyncTask().execute();

    // when a page has finished loading dismiss any progress dialog
    if (progressDialog != null && progressDialog.isShowing())
    {
        progressDialog.dismiss();
    }
}
public class SendRequestAsyncTask extends AsyncTask <Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        //runs in ui thread
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("myscript.php");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("request", "12345"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);

            // writing response to log
            HttpEntity resEntity = response.getEntity();

            if (resEntity != null) {

                String responseStr = EntityUtils.toString(resEntity).trim();
                Log.v(TAG, "Response: " +  responseStr);

                String[] parts = responseStr.split(":");
                parts[1] = parts[1].replace("\"", "");
                parts[1] = parts[1].replace("}", "");

                if (parts[1].equals("01")){
                    actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
                } else {
                    Log.v(TAG, "No success: " + parts[1]);
                }

            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //runs in ui thread you can update the layout here
    }
}
公共类SendRequestAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
//在ui线程中运行
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost=newhttppost(“myscript.php”);
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“请求”、“12345”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
//将响应写入日志
HttpEntity当前性=response.getEntity();
if(最近性!=null){
String responsest=EntityUtils.toString(resEntity.trim();
Log.v(标签,“响应:+responsest”);
String[]parts=responsest.split(“:”);
零件[1]=零件[1]。替换(“\”,“);
零件[1]=零件[1]。替换(“}”和“);
如果(第[1]部分等于(“01”)){
actionBar.setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#ffffffff”));
}否则{
Log.v(标签“未成功:+部分[1]);
}
}
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
//在ui线程中运行您可以在此处更新布局
}
}

但是,这会使我的应用程序崩溃。因此,我猜我需要在
onPageFinished
方法中更改Actionbar的颜色。但是,我真的不知道如何将变量从
AsyncTask
获取到
onPageFinished
。此外,我不知道如何将颜色从
@color/
xmlf更改为颜色ile…

不,您需要在onPostExecute中设置颜色。这在UI线程上,可以安全地触摸UI。只要将调用移动到那里,您就应该停止崩溃。当然,您可能需要将一些数据传递到onPostExecute才能正确执行(或者将其存储在AsyncTask的类变量中)。

尝试类似的方法

    public class SendRequestAsyncTask extends AsyncTask <Void, String, String> {

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    //runs in ui thread
}

@Override
protected String doInBackground(Void... params) {
    // TODO Auto-generated method stub
    String strReturn = "";

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("myscript.php");

    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("request", "12345"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

        // writing response to log
        HttpEntity resEntity = response.getEntity();

        if (resEntity != null) {

            String responseStr = EntityUtils.toString(resEntity).trim();
            Log.v(TAG, "Response: " +  responseStr);

            String[] parts = responseStr.split(":");
            parts[1] = parts[1].replace("\"", "");
            parts[1] = parts[1].replace("}", "");

            strReturn = parts[1];
        }

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

    return strReturn;
}

@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    //runs in ui thread you can update the layout here

    if (result.equals("01")){
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
    } else {
        Log.v(TAG, "No success: " + parts[1]);
    }
}
}
公共类SendRequestAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
//在ui线程中运行
}
@凌驾
受保护字符串doInBackground(无效…参数){
//TODO自动生成的方法存根
字符串strReturn=“”;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost=newhttppost(“myscript.php”);
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“请求”、“12345”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
//将响应写入日志
HttpEntity当前性=response.getEntity();
if(最近性!=null){
String responsest=EntityUtils.toString(resEntity.trim();
Log.v(标签,“响应:+responsest”);
String[]parts=responsest.split(“:”);
零件[1]=零件[1]。替换(“\”,“);
零件[1]=零件[1]。替换(“}”和“);
strReturn=零件[1];
}
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
返回strReturn;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
//在ui线程中运行您可以在此处更新布局
如果(结果等于(“01”)){
actionBar.setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#ffffffff”));
}否则{
Log.v(标签“未成功:+部分[1]);
}
}
}

确实有道理,我如何将数据正确地传递给onPostExecute?从doInBackground返回的值被传递到onPostExecute。