我们可以将我们的编程放在android中的doInBackground()中

时间:2013-12-21 06:44:02

标签: android

我正在开发一个Android项目>>>> 当我尝试在android中的doInBackground()方法中执行任何代码时......它没有给出错误但没有正常运行.... 这是我的代码......

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> 
{
    protected Bitmap doInBackground(String... urls) 
    {
        button.setVisibility(View.VISIBLE);
        return DownloadImage(urls[0]);
    }
    protected void onPostExecute(Bitmap result) 
    {

        ImageView img = (ImageView) findViewById(R.id.img);
        img.setImageBitmap(result);
    }
}

当我删除 button.setVisibility(View.VISIBLE);

时,此代码正常工作

我的查询是否可以像doInBackground()方法中的可见性或编程类型那样....

5 个答案:

答案 0 :(得分:4)

您必须在 UI 线程中设置可见性,否则它将无法工作。如果您使用不同的线程MessageHandler,或者可以使用runOnUiThread(使用runnable)来设置可见性。例如:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // set visibility here
            }
});

答案 1 :(得分:2)

在doInBackground()方法中,您无法进行UI Realated Operations。

如果你必须做UI相关操作,请使用onPreExcuteMethod()或onPostExcute(),

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> 
 {

protected void onPreExcute(){
 // Before starting the function.
 button.setVisibility(View.VISIBLE);
}
protected Bitmap doInBackground(String... urls) 
{

    return DownloadImage(urls[0]);
}
protected void onPostExecute(Bitmap result) 
{
// after completion of the function.
//     button.setVisibility(View.VISIBLE);

    ImageView img = (ImageView) findViewById(R.id.img);
    img.setImageBitmap(result);
}

}

我认为这样可行,或者你可以根据你的功能使用post Excute方法

答案 2 :(得分:1)

您可以将此行button.setVisibility(View.VISIBLE);放入asynctask的onPreExcute()方法

您无法在doInBackground()中更新自己的用户界面。 How to use AsyncTask in android

答案 3 :(得分:1)

您无法更新doInBackground()中的任何UI元素,因为此方法在单独的(非UI)线程中执行。

使用onPreExecute()代替

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> 
{

    protected void onPreExecute(){
         button.setVisibility(View.VISIBLE);
    }

    protected Bitmap doInBackground(String... urls) 
    {
        return DownloadImage(urls[0]);
    }
    protected void onPostExecute(Bitmap result) 
    {
        ImageView img = (ImageView) findViewById(R.id.img);
        img.setImageBitmap(result);
    }
}

答案 4 :(得分:1)

要在doInBackground中使用UI,则需要使用runOnUiThread。

runOnUiThread(new Runnable() {
                    public void run() {
                        // some code #3 (Write your code here to run in UI thread)

                    }
                });

由于