如何在AsyncTask之后更改ActionBar颜色?

时间:2014-06-27 21:04:37

标签: java android android-asynctask

在我的应用中,我在附加到WebView的AsyncTask中执行了onPageFinished。此方法如下所示:

@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();
    }
}

SendRequestAsyncTask看起来像这样:

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

但是,这会导致我的应用崩溃。所以我的猜测是我需要在onPageFinished方法中更改Actionbar的颜色。但是,我真的不知道如何从AsyncTaskonPageFinished获取变量。此外,我不知道如何将颜色更改为@color/ xml文件中的颜色...

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

尝试这样的事情,

    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]);
    }
}
}