通过回调到主类来通知asyncTask进度

时间:2014-01-02 14:19:00

标签: android android-asynctask

我有asyncTask类:

public class DownloadJar {


    public DownloadJar(String serialnum) 
    {

         if (serialnum!=null) 
         {
             this.serialnum = serialnum;         
             new Download().execute();
         }  
    }

    private class Download extends AsyncTask<String, Integer, String>
    {

        @Override
        protected String doInBackground(String... params) {

         //Downloading stuff

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {

            //Need to notify main class
            super.onProgressUpdate(values);
        }

    }
}

我通过主要类激活它:

    public class FTPDownload extends Activity{  

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ftpdownload);


        Bundle extras = getIntent().getExtras();
        if (extras != null) 
        {
            serialnum = extras.getString("serialnum");
        }

         if (serialnum!=null) 
         {

            DownloadJar dj = new DownloadJar(serialnum);
         }       

    }
}

如何从DownloadJar创建回调以通知我的主类有关进度的信息?

4 个答案:

答案 0 :(得分:1)

如果您在主课程中需要onProgressUpdate(),请在那里覆盖它。等,

DownloadJar dj = new DownloadJar(serialnum){
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }
};

答案 1 :(得分:1)

将活动中创建的处理程序与serialnum Async的构造函数中的DownloadJar字符串一起传递,并从onProgressUpdate中调用它:

handler.sendEmptyMessage(0);

您可以通过AsyncTask中的消息传递数据,您可以像这样接收活动中的事件

handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
    //do something 
  }

};

有关详细信息:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

答案 2 :(得分:1)

您可以创建界面,即:

interface UpdateProgress {
 void progressUpdate(String s)
}

让你的班级FTPDownload(它是你的主类?)实现它。然后在创建DownloadJar时,将对您的活动的引用传递给它。然后,您可以从主要活动的DownloadJar.Download asynctask progressUpdate中调用onProgressUpdate。您必须记住在配置更改时更新此参考。

如果另一方面,DownloadJar是你的主类,那么你已经可以访问它了,你的asynctask是它的内部。

答案 3 :(得分:0)

您已创建接口,以便您可以从AsyncTask的onPostExecute方法设置该接口方法中的数据。并将接口方法作为匿名内部类传递,就像onClickListner一样。

在这里你可以找到nice explanation